У меня есть отношения OneToOne между двумя объектами одного класса в приложении Django. Можно ли навязать уникальность этих отношений? - PullRequest
0 голосов
/ 15 мая 2018

В моем приложении есть следующее:

class University(models.Model):
    ...
    sister_university = models.OneToOneField('self', related_name = 
                        'university_sister_university', 
                        blank=True, null=True, 
                        on_delete=models.SET_NULL)

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

Например, вВ базе данных, если я выберу университет A в качестве сестринского университета университета B, я хочу, чтобы мне также было разрешено выбрать университет B в качестве сестринского университета в университете A.Однако, как это и есть, эти вторые отношения не навязываются.

Например: Прямо сейчас, на сайте администратора Django, если я сначала выберу университет A в качестве сестринского университета университета B, я все еще могу выбрать любой другой университет в качестве дочернего университета университета A,Я не ограничен только выбором университета B.

Можно ли реализовать эту уникальность на уровне базы данных?Есть ли лучший способ выполнить то, что я пытаюсь сделать?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Я думаю, что вам нужно сделать эти отношения симметричными .

. Вы можете сделать это, переопределив метод save() модели University:

def save(self, *args, **kwargs):
    super(University, self).save()
    if self.sister_university:
        self.sister_university.sister_university = self
0 голосов
/ 22 мая 2018

Я никогда такого не делал, но я думаю, что вы можете сделать этот процесс следующим образом:

Метод: unique_together ()

Вы можете использовать Options.unique_together и установить ваш университет_А и университет_В как уникальную пару.

unique_together = ("university_A", "university_B")

В вашем файле models.py у вас должно быть что-то вроде этого (возможно, с некоторыми проблемами, но идея есть):

class University(models.Model):
    ...
    university = models.ForeignKey('self', on_delete=models.CASCADE)
    sister_university = models.ForeignKey('self', on_delete=models.CASCADE)
    class Meta:
        unique_together     = (('university','sister_university'),)

Вы должны найти там драгоценные детали: https://docs.djangoproject.com/en/2.0/ref/models/options/

Я никогда не пробовал эту команду, но, похоже, она решает вашу проблему в соответствии с вашим контекстом.

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