2013-02-02 23 views
22

Próbuję utworzyć 3 modele; Person, Address i Anniversy. Plan zakłada posiadanie jednego adresu i jednej rocznicy dla każdej osoby. Ale każdy adres i rocznica może mieć wiele osób.Klucz obcy Django Model

Do tej pory mam następujące, ale myślę, że relacje OneToMany(foreign key) może być w niewłaściwy sposób. tj. każdy adres może mieć jedną osobę, ale każda osoba może mieć wiele adresów.

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) 

Odpowiedz

47

Tworzysz relacje na odwrót; dodać kluczy obcych do rodzaju Person stworzyć wiele-do-One zależność:

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() 

Każda jedna osoba może być podłączony tylko do jeden adres i jeden rocznicy, ale adresy i rocznice można odwoływać się od wiele wpisów Person.

Anniversary i Address obiekty będą miały również odwrotną relację wsteczną; domyślnie będzie to nazywane person_set, ale możesz skonfigurować inną nazwę, jeśli potrzebujesz. Zobacz następujące relationships "backward" w dokumentacji zapytań.