В Django, для отношений OneToOne между двумя объектами одного и того же класса, можно ли предотвратить объект от ссылки на себя на уровне БД? - 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)

На сайте администратора Django я могу выбрать Университет A в качестве сестринского университета Университета A (самого себя).Можно ли применить какое-то правило на уровне базы данных, чтобы университетский объект никогда не мог быть собственным сестринским университетом?

В качестве альтернативы, есть ли лучший способ выполнить то, что я пытаюсь сделать?

Ответы [ 2 ]

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

На уровне модели вы можете переопределить метод clean() вашей модели, чтобы реализовывать эту проверку при каждом сохранении экземпляра University.

def clean(self):

    if self.sister_university.id == self.id:
        raise ValidationError('A university object can never be its own sister_university.')
0 голосов
/ 16 мая 2018

То, что вы хотите - это ограничение check, что-то вроде:

alter table university
add constraint chk_non_self_ref check (id <> sister_university_id);

Я не знаю, как это определить в моделях Django (но я предполагаю, что вы можете добавить его вмиграция).

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