web-dev-qa-db-fra.com

Clé étrangère Django Model

J'essaie de créer 3 modèles; Person, Address et Anniversy. Le plan est d'avoir une adresse et un anniversaire pour chaque personne. Mais chaque adresse et chaque anniversaire peuvent avoir plusieurs personnes.

Jusqu'à présent, j'ai ce qui suit, mais je pense que les relations OneToMany(foreign key) peuvent être à l'envers. c'est-à-dire que chaque adresse peut avoir une personne mais chaque personne peut avoir plusieurs adresses.

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)
37
PacketPimp

Vous créez les relations dans l'autre sens; ajoutez des clés étrangères au type Person pour créer une relation plusieurs-à-un:

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

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

Toute personne ne peut être connectée qu'à une adresse et un anniversaire, mais les adresses et les anniversaires peuvent être référencés à partir de plusieurs entrées Person.

Les objets Anniversary et Address recevront également une relation inverse et arrière; par défaut, il sera appelé person_set mais vous pouvez configurer un nom différent si nécessaire. Voir Suite relations "en arrière" dans la documentation des requêtes.

72
Martijn Pieters