Python có tương đương với toString () và tôi có thể chuyển đổi phần tử db.Model thành String không?


87

Tôi đang viết một ứng dụng danh sách Công việc để giúp bản thân bắt đầu với Python. Ứng dụng đang chạy trên GAE và tôi đang lưu trữ các mục todo trong Data Store. Tôi muốn trưng bày các mặt hàng của mọi người cho họ, và một mình họ. Vấn đề là ứng dụng hiện hiển thị tất cả các mục cho tất cả người dùng, vì vậy tôi có thể thấy những gì bạn viết và bạn thấy những gì tôi viết. Tôi nghĩ rằng việc truyền đối tượng todo.author của mình thành một chuỗi và xem liệu nó có khớp với tên của người dùng hay không sẽ là một khởi đầu tốt, nhưng tôi không thể tìm ra cách thực hiện điều đó.

Đây là những gì tôi có trong 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('/')

Trong index.html của tôi, ban đầu tôi có cái này:

<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>

nhưng tôi chỉ muốn hiển thị các mục cho người dùng đã tạo ra chúng. Tôi đã nghĩ đến việc thử

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

không có kết quả. Danh sách trống. Tôi cho rằng đó là vì todo.author không phải là một chuỗi. Tôi có thể đọc giá trị dưới dạng một chuỗi hay tôi có thể truyền đối tượng thành Chuỗi không?

Cảm ơn!

Chỉnh sửa: Đây là lớp Todo của tôi

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

Việc thay đổi tác giả của tôi thành StringProperty có ảnh hưởng tiêu cực gì không? Có lẽ tôi có thể từ bỏ việc casting hoàn toàn.

Câu trả lời:


92

Trong python, str()phương thức này tương tự như toString()phương thức trong các ngôn ngữ khác. Nó được gọi là truyền đối tượng để chuyển đổi thành một chuỗi dưới dạng tham số. Bên trong nó gọi __str__()phương thức của đối tượng tham số để lấy biểu diễn chuỗi của nó.

Tuy nhiên, trong trường hợp này, bạn đang so sánh một UserPropertytác giả từ cơ sở dữ liệu, thuộc loại users.Uservới chuỗi biệt hiệu. Bạn sẽ muốn so sánh thuộc nicknametính của tác giả thay vì todo.author.nicknametrong mẫu của bạn.


Cảm ơn vì câu trả lời. Tôi gặp lỗi sau khi thử str (todo.author) trong mẫu: TemplateSyntaxError: Could not parse the remainder: '(todo.author)' from 'str(todo.author)'bất kỳ ý tưởng nào?
Amru E.

1
Hãy thử đặt dấu ngoặc kép 'str(todo.author)'như vậy. Tôi không có kinh nghiệm với các mẫu Django, nhưng có vẻ như cơ chế phân tích cú pháp của nó đang bị treo ở dấu ngoặc đơn sau strtên hàm. Hoặc bạn có thể lấy thuộc tính chuỗi của tác giả, có thể là một cái gì đó giống như todo.author.nickname, mà không cần str()gọi.
Jeff Lockhart

Tôi cuối cùng cũng có nó để làm việc! Tôi đã sử dụng todo.author.nickname trong câu lệnh if của mình và kiểm tra xem giá trị đó có khớp với biệt hiệu của người dùng hiện tại hay không. Vui lòng chỉnh sửa câu trả lời của bạn để đưa vào câu trả lời đó để tôi có thể chấp nhận.
Amru E.

36

Trong Python, chúng ta có thể sử dụng __str__()phương thức này.

Chúng ta có thể ghi đè nó trong lớp của mình như thế này:

class User: 

    firstName = ''
    lastName = ''
    ...

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

và khi chạy

print(user)

nó sẽ gọi hàm __str__(self) và in firstName và lastName


6

str() là tương đương.

Tuy nhiên, bạn nên lọc truy vấn của mình. Hiện tại truy vấn của bạn là all()của Todo.

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

hoặc là

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

tùy thuộc vào những gì bạn đang xác định tác giả như trong mô hình Todo. A StringPropertyhoặc UserProperty.

Lưu ý nicknamelà một phương pháp. Bạn đang chuyển phương thức chứ không phải kết quả trong các giá trị mẫu.


Cảm ơn đã trả lời! Tôi sẽ tiếp tục và cố gắng triển khai bộ lọc ngay bây giờ. Tôi hơi bối rối về biệt danh. Tôi đã từng chơi với nó trước đây và tôi có thể thao tác nó như bất kỳ chuỗi nào khác và gửi nó qua giá trị mẫu tốt. Tui bỏ lỡ điều gì vậy? Ồ và tác giả là một UserProperty. Tôi sẽ thêm điều đó vào câu hỏi ban đầu của tôi.
Amru E.

Tôi không sử dụng các mẫu django, vì vậy tôi không biết chúng sẽ làm gì. Một số hệ thống tạo khuôn mẫu sẽ tự động gọi các vật có thể gọi (biệt hiệu ())
Tim Hoffman

Bạn có phiền giải thích ngắn gọn bộ lọc sẽ làm gì không? Tôi không chắc chức năng thực sự của todos = Todo.all () của mình là gì.
Amru E.

Như bạn có thể thấy từ mã exmaple, bộ lọc là một đối số truy vấn, cụ thể là thuộc tính tác giả = một số giá trị. Bạn thực sự nên dành thời gian đọc tài liệu, nó sẽ giúp bạn tiết kiệm rất nhiều thời gian. developers.google.com/appengine/docs/python/datastore nói về kho dữ liệu và làm thế nào để có được / đặt và truy vấn dữ liệu.
Tim Hoffman

2

Bạn nên xác định __unicode__phương thức trên mô hình của mình và mẫu sẽ tự động gọi nó khi bạn tham chiếu phiên bản.


2

Trong hàm post ():

todo.author = users.get_current_user()

Vì vậy, để có str (todo.author), bạn cần str (users.get_current_user ()). Hàm get_current_user () trả về cái gì?

Nếu nó là một đối tượng, hãy kiểm tra xem nó có chứa hàm str () "không?

Tôi nghĩ lỗi nằm ở đó.


users.get_current_user () trả về đối tượng Người dùng có biệt hiệu () để cung cấp tên có thể đọc được cho người dùng. Tôi đã gặp khó khăn trong việc lấy chính xác biệt hiệu, nhưng tôi đã tìm ra. Cảm ơn!
Amru E.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.