2010-05-25 37 views
6

Các hướng dẫn trên trang web django cho thấy mã này cho các mô hình:mô hình Django & Python lớp thuộc tính

from django.db import models 

class Poll(models.Model): 
    question = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

class Choice(models.Model): 
    poll = models.ForeignKey(Poll) 
    choice = models.CharField(max_length=200) 
    votes = models.IntegerField() 

Bây giờ, mỗi người trong số những thuộc tính, là một thuộc tính lớp, phải không? Vì vậy, cùng một thuộc tính nên được chia sẻ bởi tất cả các trường hợp của lớp. Một lát sau, họ trình bày mã này:

class Poll(models.Model): 
    # ... 
    def __unicode__(self): 
     return self.question 

class Choice(models.Model): 
    # ... 
    def __unicode__(self): 
     return self.choice 

Làm cách nào họ chuyển từ thuộc tính lớp thành thuộc tính ví dụ? Tôi có nhận được thuộc tính lớp sai không?

Trả lời

4

Hãy xem qua lớp Model theo django/db/models.py. Có các thuộc tính lớp đang quay sang dụ thuộc tính thông qua một cái gì đó giống như

setattr(self, field.attname, val) 

Người ta có thể giới thiệu toàn bộ tập tin (ModelBaseModel lớp) như là một tay-on tuyệt vời ví dụ về metaclasses.

1

Nó được thực hiện với metaclasses - những thứ rất thông minh. Tôi muốn giới thiệu cuốn sách tuyệt vời của Marty Alchin Pro Django nếu bạn muốn tìm hiểu thêm.

1

Trong Python, một thuộc tính lớp phải lúc nào cũng còn là một thuộc tính Ví dụ:

class C(object): 
    a = 1 
    def show_a(self): 
     print self.a # <- works 

Nhưng trong django nó thêm phức tạp bởi thực tế là các lớp mẫu có metaclasses đặc biệt, vì vậy hãy cẩn thận để giả định của bạn!

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