2012-08-23 29 views
20

Tôi có hai mô hình liên quan với nhau bằng cách sử dụng ForeignKey và related_name được sử dụng. Đây là một ví dụ.Sử dụng related_name đúng trong Django

class Student(models.Model): 
    name = models.CharField(max_length=255) 
    birthday = models.DateField(blank=True) 


class Class(models.Model): 

    name = models.CharField(max_length=255) 
    student = models.ForeignKey(Student, 
           related_name='classes', 
           null=True) 

    def __unicode__(self): 
     return self.name 

Ví dụ: tôi muốn truy cập tên lớp học.

Đây là những gì tôi đã thử.

john = Student.objects.get(username = 'john') 
print john.classes.name 

không có gì được in.

Nhưng khi tôi cố gắng john.classes

tôi nhận được đối tượng django.db.models.fields.related.RelatedManager tại 0x109911410. Điều này cho thấy rằng chúng có liên quan. Nhưng tôi muốn lấy tên lớp.

Tôi đang làm gì sai? Làm thế nào để tôi truy cập tên của lớp bằng cách sử dụng related_name? Cần một số hướng dẫn.

Trả lời

18

Có, lớp học là người quản lý. Nó có thể là một vài lớp cho một giáo viên. Vì vậy, để xuất tên của họ, bạn nên làm:

john = Student.objects.get(username = 'john') 
for class2 in john.classes.all(): 
    print class2.name 

Nếu bạn muốn chỉ có một lớp cho một sinh viên, sau đó sử dụng mối quan hệ một-một. Trong trường hợp này, bạn có thể truy cập trường liên quan bằng phương pháp của bạn.

+0

chỉ có một lớp cho mỗi trẻ. thì tại sao không john.classes.name? – lakesh

+0

giải pháp của bạn hoạt động nhưng muốn biết tại sao john.classes.name không hoạt động? – lakesh

+0

Vì ForeignKey tạo một số lớp cho một trẻ, không phải một lớp. Nếu bạn chỉ muốn một lớp sử dụng trường onetoone. – sergzach

3

Chỉ cần lưu ý: bạn đang xác định mối quan hệ 1-nhiều. Vì vậy, sinh viên có thể có nhiều lớp, do đó john.classes.name không thể làm việc, vì bạn chưa chỉ định lớp mà bạn muốn có tên. trong các lớp "john.classes" chỉ là một người quản lý mà bạn có thể sử dụng giống như bất kỳ Trình quản lý mô hình Django nào khác. Bạn có thể làm một john.classes.all() (như sergzach propsed), nhưng cũng có những thứ như john.classes.get (...) hoặc john.classes.filter (...).

1

bạn có thể làm như thế này để truy cập vào hàng đầu tiên trong bảng

john = Student.objects.get(username = 'john')  
john.classes.all().first().name # to access first row 
john.classes.all().last().name # to access last row 

trong ví dụ trên bạn không muốn để lặp qua các đối tượng

nó sẽ cung cấp cho bạn tên của lớp học trong hàng đầu tiên

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