Python มีคุณสมบัติเทียบเท่า toString () หรือไม่และฉันสามารถแปลงองค์ประกอบ db.Model เป็น String ได้หรือไม่


90

ฉันกำลังเขียนแอพ ToDo list เพื่อช่วยตัวเองในการเริ่มต้นกับ Python แอปทำงานบน GAE และฉันกำลังจัดเก็บรายการสิ่งที่ต้องทำใน Data Store ฉันต้องการแสดงรายการของทุกคนให้พวกเขาและพวกเขาคนเดียว ปัญหาคือขณะนี้แอปแสดงรายการทั้งหมดแก่ผู้ใช้ทั้งหมดดังนั้นฉันจึงเห็นสิ่งที่คุณเขียนและคุณเห็นสิ่งที่ฉันเขียน ฉันคิดว่าการส่งวัตถุ todo.author ของฉันไปที่สตริงและดูว่ามันตรงกับชื่อผู้ใช้หรือไม่จะเป็นการเริ่มต้นที่ดี แต่ฉันคิดไม่ออกว่าจะทำอย่างไร

นี่คือสิ่งที่ฉันมีใน main.py ของฉัน

... 
user = users.get_current_user()

if user:
    nickname = user.nickname()
    todos = Todo.all()
    template_values = {'nickname':nickname, 'todos':todos}
...

def post(self):

    todo = Todo()
    todo.author = users.get_current_user()
    todo.item = self.request.get("item")
    todo.completed = False

    todo.put()      
    self.redirect('/')

ใน index.html ของฉันเดิมทีฉันมีสิ่งนี้:

<input type="text" name="item" class="form-prop" placeholder="What needs to be done?" required/>
...
 <ul>
{% for todo in todos %}
  <input type="checkbox"> {{todo.item}} <hr />
{% endfor %}
</ul>

แต่ฉันต้องการแสดงรายการต่อผู้ใช้ที่สร้างขึ้นเท่านั้น ฉันคิดว่าจะพยายาม

{% for todo in todos %}
    {% ifequal todo.author nickname %}
  <input type="checkbox"> {{todo.item}} <hr />
    {% endifequal %}
{% endfor %}

ไม่มีประโยชน์ รายการจะว่างเปล่า ฉันคิดว่าเป็นเพราะสิ่งที่ต้องทำผู้เขียนไม่ใช่สตริง ฉันสามารถอ่านค่าเป็นสตริงได้หรือไม่หรือฉันสามารถส่งวัตถุเป็น String ได้หรือไม่

ขอบคุณ!

แก้ไข: นี่คือคลาส Todo ของฉัน

class Todo(db.Model):
author = db.UserProperty()
item = db.StringProperty()
completed = db.BooleanProperty()
date = db.DateTimeProperty(auto_now_add=True)

การเปลี่ยนผู้เขียนของฉันเป็น StringProperty จะส่งผลเสียอะไรหรือไม่? บางทีฉันอาจจะทิ้งการคัดเลือกไปเลยก็ได้

คำตอบ:


96

ใน python str()วิธีการนี้คล้ายกับtoString()วิธีการในภาษาอื่น ๆ เรียกว่าการส่งผ่านวัตถุเพื่อแปลงเป็นสตริงเป็นพารามิเตอร์ ภายในจะเรียก__str__()เมธอดของออบเจ็กต์พารามิเตอร์เพื่อรับการแทนค่าสตริง

อย่างไรก็ตามในกรณีนี้คุณกำลังเปรียบเทียบUserPropertyผู้เขียนจากฐานข้อมูลซึ่งเป็นประเภทที่users.Userมีสตริงชื่อเล่น คุณจะต้องเปรียบเทียบnicknameคุณสมบัติของผู้แต่งแทนtodo.author.nicknameในเทมเพลตของคุณ


ขอบคุณสำหรับคำตอบ. ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อลองใช้ str (todo.author) ในเทมเพลต: TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'มีแนวคิดใดบ้าง
Amru E.

1
ลองใส่เครื่องหมายคำพูด'str(todo.author)'แบบนั้น ฉันไม่มีประสบการณ์กับเทมเพลต Django แต่ดูเหมือนว่ากลไกการแยกวิเคราะห์ของมันจะถูกวางไว้ที่วงเล็บหลังstrชื่อฟังก์ชัน หรือคุณอาจจะได้รับคุณสมบัติสตริงของผู้เขียนซึ่งอาจเป็นไปtodo.author.nicknameได้โดยไม่จำเป็นต้องมีการstr()โทร
Jeff Lockhart

ในที่สุดฉันก็ใช้งานได้! ฉันใช้ todo.author.nickname ในคำสั่ง if ของฉันและตรวจสอบว่าค่านั้นตรงกับชื่อเล่นของผู้ใช้ปัจจุบันหรือไม่ โปรดแก้ไขคำตอบของคุณเพื่อรวมไว้เพื่อให้ฉันสามารถยอมรับได้
Amru E.

37

ใน Python เราสามารถใช้__str__()วิธีการ

เราสามารถลบล้างได้ในชั้นเรียนของเราดังนี้:

class User: 

    firstName = ''
    lastName = ''
    ...

    def __str__(self):
        return self.firstName + " " + self.lastName

และเมื่อทำงาน

print(user)

มันจะเรียกใช้ฟังก์ชัน__str__(self) และพิมพ์ firstName และ lastName


6

str() เทียบเท่า

อย่างไรก็ตามคุณควรกรองคำค้นหาของคุณ ในขณะนี้คำถามของคุณคือall()สิ่งที่ต้องทำ

todos = Todo.all().filter('author = ', users.get_current_user().nickname()) 

หรือ

todos = Todo.all().filter('author = ', users.get_current_user())

ขึ้นอยู่กับสิ่งที่คุณกำหนดผู้เขียนในแบบจำลองสิ่งที่ต้องทำ A StringPropertyหรือUserProperty.

หมายเหตุnicknameเป็นวิธีการ คุณกำลังส่งผ่านเมธอดไม่ใช่ผลลัพธ์ในค่าเทมเพลต


ขอบคุณสำหรับการตอบ! ฉันจะดำเนินการต่อและพยายามใช้ตัวกรองทันที ฉันสับสนเล็กน้อยเกี่ยวกับชื่อเล่น ฉันเคยเล่นกับมันมาก่อนและฉันสามารถจัดการมันได้เหมือนกับสตริงอื่น ๆ และส่งผ่านค่าเทมเพลตได้ดี ฉันพลาดอะไรไปรึเปล่า? โอ้และผู้เขียนเป็น UserProperty ฉันจะเพิ่มคำถามนั้นในคำถามเดิมของฉัน
Amru E.

ฉันไม่ได้ใช้เทมเพลต django ดังนั้นฉันจึงไม่รู้ว่าพวกเขาจะทำอะไร ระบบแม่แบบบางระบบจะเรียกโดยอัตโนมัติ (ชื่อเล่น ())
Tim Hoffman

คุณช่วยอธิบายสั้น ๆ ว่าตัวกรองจะทำอย่างไร ฉันไม่แน่ใจว่าฟังก์ชันจริงของ todos = Todo.all () คืออะไร
Amru E.

ดังที่คุณเห็นจากโค้ด exmaple ตัวกรองคืออาร์กิวเมนต์เคียวรีโดยเฉพาะ author property = some value คุณใช้เวลาอ่านเอกสารมากจริงๆมันจะช่วยให้คุณประหยัดเวลาได้มาก Developers.google.com/appengine/docs/python/datastoreพูดถึงพื้นที่เก็บข้อมูลและวิธีรับ / ใส่และค้นหาข้อมูล
Tim Hoffman


2

ในฟังก์ชันโพสต์ ():

todo.author = users.get_current_user()

ดังนั้นในการรับ str (todo.author) คุณต้องมี str (users.get_current_user ()) สิ่งที่ส่งคืนโดยฟังก์ชัน get_current_user ()

หากเป็นวัตถุให้ตรวจสอบว่ามีฟังก์ชันstr () "หรือไม่

ฉันคิดว่าข้อผิดพลาดอยู่ที่นั่น


users.get_current_user () ส่งคืนอ็อบเจ็กต์ User ที่มีชื่อเล่น () เพื่อระบุชื่อที่อ่านได้สำหรับผู้ใช้ ฉันมีปัญหาในการตั้งชื่อเล่นให้ถูกต้อง แต่ฉันคิดออก ขอบคุณ!
Amru E.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.