моделирование один-к-одному и один-ко-многим - PullRequest
1 голос
/ 11 февраля 2012

Так же есть люди и адреса. Человек может иметь более одного адреса, но только один адрес может быть помечен как основной на человека. Ниже приведены два способа, которыми я подумал сделать это.

Первое неудобно при сохранении, так как я должен сохранить человека, затем вариант, а затем снова человека с вариантом pk.

При втором подходе кажется, что единственный способ не дать человеку иметь более одного основного адреса - это добавить проверку в код.

# First approach
class Person(models.Model):
    primary_address = models.ForeignKey('Address')
    ...


class Address(models.Model):
    person = models.ForeignKey(Person)
    ...

# Second approach
class Person(models.Model):
    ...

class Address(models.Model):
    person = models.ForeignKey(Person)
    is_primary = models.BooleanField()
    ...

1 Ответ

0 голосов
/ 11 февраля 2012

Я обычно выбираю вариант № 2 для подобных ситуаций. Запрос немного сложнее, так как иногда вам нужно выполнить дополнительный запрос + фильтр, чтобы выбрать его, но он также дает вам возможность сохранить его более аккуратно, как вы упомянули.

С помощью опции # 2 вы можете переопределить метод сохранения модели адресов, чтобы он помечал все другие адреса пользователя как неосновные, если он сам является первичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...