2013-02-02 38 views
22

Tôi đang cố tạo 3 mô hình; Person, AddressAnniversy. Kế hoạch là có một địa chỉ và một buổi lễ kỷ niệm cho mỗi người. Nhưng mỗi địa chỉ và lễ kỷ niệm có thể có nhiều người.Phím nước ngoài Mô hình Django

Cho đến nay tôi có những điều sau đây, nhưng tôi nghĩ rằng các mối quan hệ OneToMany(foreign key) có thể là vòng sai. nghĩa là mỗi địa chỉ có thể có một người nhưng mỗi người có thể có nhiều địa chỉ.

from django.db import models 

class Person(models.Model): 
    name = models.CharField(max_length=50) 
    birthday = models.DateField() 

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

class Address(models.Model): 
    person = models.ForeignKey(Person) 
    address = models.CharField(max_length=150) 

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

class Anniversy(models.Model): 
    person = models.ForeignKey(Person) 
    anniversy = models.DateField() 

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

Trả lời

47

Bạn tạo mối quan hệ theo cách khác; thêm phím nước ngoài để loại Person để tạo ra một Nhiều to-One-mối quan hệ:

class Person(models.Model): 
    name = models.CharField(max_length=50) 
    birthday = models.DateField() 
    anniversary = models.ForeignKey(Anniversary) 
    address = models.ForeignKey(Address) 

class Address(models.Model): 
    line1 = models.CharField(max_length=150) 
    line2 = models.CharField(max_length=150) 
    postalcode = models.CharField(max_length=10) 
    city = models.CharField(max_length=150) 
    country = models.CharField(max_length=150) 

class Anniversary(models.Model): 
    date = models.DateField() 

Bất kỳ một người duy nhất có thể được kết nối với một địa chỉ và một kỷ niệm, nhưng địa chỉ và ngày kỷ niệm có thể được tham chiếu từ nhiều mục nhập Person.

AnniversaryAddress đối tượng cũng sẽ được cung cấp một mối quan hệ ngược lại; theo mặc định, nó sẽ được gọi là person_set nhưng bạn có thể định cấu hình tên khác nếu cần. Xem Theo dõi relationships "backward" trong tài liệu truy vấn.

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