2012-04-14 35 views
8

Vì vậy, tôi đã kết nối Django với một cơ sở dữ liệu đã tồn tại thành công (kiểm tra, xác thực và đồng bộ) và tôi đã tạo một ứng dụng và một dự án và tất cả (tôi đọc sách Django và 'm trên chương 5), nhưng khi tôi thực sự chạy nó và in các công cụ, tôi nhận được một lỗi (giả định). Trong thời gian ở python, tôi đúng nhập khẩu những gì tôi cần (from myapp.models import Artist) nhưng nếu tôi cố gắng để in, ví dụ, năm hàng đầu tiên trong bảng (print Artist.objects.all()[:5]), tôi có được điều này:In các đối tượng ở Django

[<Artist: Artist object>, <Artist: Artist object>, <Artist: Artist object>, <Artist: Artist object>, <Artist: Artist object>] 

Tại sao không nó thực sự in các giá trị thay vì những gì có vẻ là một trình giữ chỗ? Có cái gì tôi đang thiếu ở đây?

Trả lời

11

Django sử dụng ORM (Object-Relational Mapper) để dịch dữ liệu qua lại giữa các đối tượng Python và các hàng cơ sở dữ liệu. Vì vậy, khi bạn sử dụng nó để lấy một mục từ cơ sở dữ liệu, nó chuyển đổi nó thành một đối tượng Python.

Nếu đối tượng đó không xác định cách hiển thị chính nó dưới dạng văn bản, Django sẽ làm điều đó cho bạn. Python làm điều tương tự:

>>> class MyObject(object): 
...  pass 
... 
>>> [MyObject(), MyObject()] 
[<__main__.MyObject object at 0x0480E650>, 
<__main__.MyObject object at 0x0480E350>] 

Nếu bạn muốn xem tất cả các giá trị thực tế cho hàng cho từng đối tượng, sử dụng values.

Dưới đây là ví dụ từ các tài liệu:

# This list contains a Blog object. 
>>> Blog.objects.filter(name__startswith='Beatles') 
[<Blog: Beatles Blog>] 

# This list contains a dictionary. 
>>> Blog.objects.filter(name__startswith='Beatles').values() 
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}] 
+0

Sau khi nhìn thấy câu trả lời này, tôi tự hỏi nếu điều này là hướng câu hỏi của mình trái ngược với câu trả lời của tôi. – jdi

+0

@jdi Câu trả lời của bạn đã truyền cảm hứng cho tôi để thêm giải thích lý do tại sao anh ấy nhìn thấy những gì anh ấy nhìn thấy, cũng như cách lấy dữ liệu hàng thực tế :) – agf

+0

Bây giờ bạn có toàn bộ kitten-kaboodle! – jdi

5

UPDATE: Trong Python 3.x, sử dụng __str__ thay vì __unicode__

gì bạn đang nhìn thấy là một danh sách các nghệ sĩ trường hợp mô hình. Giá trị của bạn nằm trong đối tượng python. Nếu bạn muốn làm cho các đại diện của những trường hợp hữu ích hơn, bạn nên xác định phương pháp __unicode__ cho họ để in một cái gì đó hữu ích:

https://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs#unicode

của nó không phải là một giữ chỗ, đại diện các đối tượng thực tế của nó, chuyển đổi sang unicode .

+0

Ahh, chúng ta đi. Tôi chỉ xác định unicode cho Artist và thử lại lần nữa, và nó hoạt động; cảm ơn! : D –

+0

@GabeC: Oh ngọt ngào, tôi đã thực sự đi đúng hướng. Tôi đã nghĩ rằng agf có thể đã được giải quyết những gì bạn thực sự muốn. – jdi

0

nếu bạn muốn sử dụng phương pháp in ovveride các unicode phương pháp trong mô hình tự

def __unicode__(self): 
    return u'%s' % (self.id) 

đây một ví dụ mô hình

class unit(models.Model): 
id = models.AutoField(primary_key=True) 
name = models.CharField(max_length=255) 
def __unicode__(self): 
    return u'%s' % (self.name) 

print(unit.objects.all()) 
[unit: KG, unit: PCs] 
+0

Bạn có thể giúp tôi hiểu làm thế nào tôi có thể loại bỏ tên model 'đơn vị' khỏi' [đơn vị: KG, đơn vị: PCs] ' cho một thể hiện, trong vòng lặp for mà tôi muốn in như sau:' A from KG' 'B từ PC' ở đây' A, B' sẽ từ một mô hình khác và 'KG, PC' là từ mô hình' đơn vị'. –

+0

Đó là câu hỏi riêng biệt không phải là nhận xét và chúng tôi cần xem thêm mã của bạn. –

Các vấn đề liên quan