Как получить поле с ForeignKey ('self') без возможности ссылки на ту же запись? - PullRequest
2 голосов
/ 27 сентября 2010

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

Вот пример:

class Example (model.Model):
    parent = models.ForeignKey('self', null=True, blank=True)
    # and some other fields

После создания новой записи в панели администратора и перехода к этому примеру для редактирования некоторого содержимого я понимаю, что могу установить в качестве родительского элемента текущую запись. Но это не то, что я хотел получить с ForeignKey и отношением к себе.

Можно ли запретить ссылку на себя?

Может быть, лучше использовать целочисленное поле с правильным выбором, но я не уверен, как реализовать этот гладкий и Python-подобный способ.

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

Один из способов сделать это - переопределить метод очистки модели

class Example(model.Model):
    #...
    def clean(self):
        if self.parent.id == self.id:
            raise ValidationError("no self referential models")

это будет вызвано как второй шаг проверки объекта и предотвратит вставку объекта в базу данных.

0 голосов
/ 27 сентября 2010

Можно запретить ссылку с экземпляра на тот же экземпляр.Один из способов добиться этого - добавить пользовательскую модель проверки .Например,

class Example(models.Model):
    ...
    def clean_fields(self):
        if self.id and self.parent.id == self.id:
            raise ValidationError(...)
...