две таблицы с ссылками на внешние ключи обратно друг к другу - PullRequest
2 голосов
/ 16 апреля 2011

У меня есть два приложения - одно для собак и одно для пометов - где в идеале я хотел бы иметь внешние ключи друг к другу, что-то вроде этого:

In dogs.py:

from litters.py import Litter
class Dog(models.Model):
    name = models.CharField(max_length=55)
    Litter = models.ForeignKey(Litter, blank=True)

In litters.py

from dogs.py import Dog
class Litter(models.Model):
    name = models.CharField(max_length=55)
    sire = models.ForeignKey(Dog, related_name='dog_sire_set')
    dam  = models.ForeignKey(Dog, related_name='dog_dam_set'

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

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

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

Ответы [ 2 ]

8 голосов
/ 16 апреля 2011

blank=True сообщает администратору, что это поле не обязательно для ввода пользователем.Но вы все равно говорите БД то же самое , вам нужно добавить null=True.И если у вас есть проблема кругового импорта, укажите название модели в виде строки .

Litter = models.ForeignKey('Litter', blank=True, null=True)

Если мусора нет, поле будет иметь значение None.

0 голосов
/ 16 апреля 2011

использовать ленивые отношения .

in dogs.py:

class Dog(models.Model):
    name = models.CharField(max_length=55)
    litter = models.ForeignKey('litters.Litter', blank=True, null=True)

в litters.py:

class Litter(models.Model):
    name = models.CharField(max_length=55)
    sire = models.ForeignKey('dogs.Dog', related_name='litters_sired')
    dam  = models.ForeignKey('dogs.Dog', related_name='litters_damed')

пример:

dog1 = Dog(name='Bob')
dog1.save()
dog2 = Dog(name='Jane')
dog2.save()

litter1 = Litter(name='BobJane', sire=dog1, dam=dog2)
litter1.save()

dog3 = Dog(name='Sonny', litter=litter1)
dog3.save()

dog1.litters_sired
[<BobJane>]
dog1.litters_damed
[]
dog1.litter
None

dog2.litters_sired
[]
dog2.litters_damed
[<BobJane>]
dog2.litter
None

dog3.litters_sired
[]
dog2.litters_damed
[]
dog2.litter
BobJane
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...