2009-02-01 42 views
10

Trước hết, tôi không tham gia lập trình web. Tôi va vào django và đọc một chút về các mô hình. Tôi bị hấp dẫn bởi đoạn mã sau (từ djangoproject.com):Các trường mô hình Django hoạt động như thế nào?


class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 

    def __str__(self): 
     # Note use of django.utils.encoding.smart_str() here because 
     # first_name and last_name will be unicode strings. 
     return smart_str('%s %s' % (self.first_name, self.last_name)) 

Theo hiểu biết của tôi về python, first_name và last_name là các biến lớp, phải không? Làm thế nào là được sử dụng trong mã (vì tôi đoán rằng thiết lập Person.first_name hoặc Person.last_name sẽ ảnh hưởng đến tất cả các cá thể Person)? Tại sao nó được sử dụng theo cách đó?

Trả lời

4

Có, first_name và last_name là các biến lớp. Chúng xác định các trường sẽ được tạo ra trong một bảng cơ sở dữ liệu. Có một bảng Person có các cột first_name và last_name, do đó, nó có ý nghĩa đối với chúng ở cấp Class tại thời điểm này.

Để biết thêm về mô hình, xem: http://docs.djangoproject.com/en/dev/topics/db/models/

Khi nói đến việc truy cập vào các trường hợp của một người trong mã, bạn thường làm điều này qua ORM Django, và vào thời điểm này họ chủ yếu hoạt động như các biến ví dụ.

Để biết thêm về trường hợp mô hình, xem: http://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs

+0

Danke schon Andy! – Geo

+0

Một số liên kết tốt ở đây, nhưng "vào thời điểm này về cơ bản, chúng hoạt động như các biến mẫu" là một chút vẫy tay không thực sự chính xác (hoặc ít nhất không giải thích được gì). –

+1

Đủ công bằng ... Tôi sẽ giơ tay lên cái đó. +1 trên câu trả lời của bạn. :) –

19

Bản chất của câu hỏi của bạn là "làm thế nào đến các biến lớp (mà tôi gán đối tượng Field để) đột nhiên trở nên biến dụ (mà tôi gán dữ liệu) trong ORM của Django "? Câu trả lời cho điều đó là sự kỳ diệu của Python metaclasses.

Một metaclass cho phép bạn nối vào và sửa đổi quy trình tạo một lớp Python (không phải là tạo ra một thể hiện của lớp đó, việc tạo ra lớp đó).

Đối tượng Mô hình của Django (và do đó cũng là mô hình của bạn, là các lớp con) có ModelBase metaclass. Nó xem xét tất cả các thuộc tính lớp của mô hình của bạn, và bất kỳ thuộc tính nào của các lớp con Field nó sẽ chuyển vào một danh sách trường. Danh sách đó được gán làm thuộc tính của đối tượng _meta, là thuộc tính lớp của mô hình. Vì vậy, bạn luôn có thể truy cập các đối tượng Field thực tế qua MyModel._meta.fields hoặc MyModel._meta.get_field('field_name').

Phương pháp Model.__init__ sau đó có thể sử dụng danh sách _meta.fields để xác định thuộc tính cá thể nào sẽ được khởi tạo khi tạo mẫu cá thể.

Đừng ngại lặn vào mã nguồn Django; đó là một nguồn giáo dục tuyệt vời!

+0

+1: Đây là voodoo tuyệt vời. Nó không phải là một cái gì đó bạn nên hiểu sâu sắc. Nhưng bạn cần phải thấy rằng nó bẻ cong các quy tắc biến thể hiện rõ ràng, thêm một lớp khác vào cách các đối tượng được tạo ra. –

+0

Giải thích hay. – Harold

+0

Tuyệt. Tôi tự hỏi: Thuộc tính '_meta' có phải là một phần của API mô hình chính thức không? – pcv

0

Không phải là một câu trả lời thật, nhưng để làm giàu:

Person.first_name 

sẽ không làm việc

p = Person.objects.get(pk=x) 
p.first_name 

sẽ làm việc. vì vậy một cá thể đối tượng của một người có một tên và họ, nhưng ngữ cảnh tĩnh Con người thì không.

Cũng lưu ý: Django có Người quản lý mô hình cho phép "Người" thực hiện thao tác truy vấn tĩnh. (https://docs.djangoproject.com/en/dev/topics/db/managers/#managers).

ví dụ như vậy

peoples = Person.objects.all() 
Các vấn đề liên quan