两个表与外键引用相互回复

时间:2011-04-16 18:22:58

标签: django model foreign-keys

我有两个应用程序 - 一个用于狗,一个用于垃圾 - 理想情况下我会将外键互相支持,如下所示:

在dogs.py中:

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

在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'

当创造一个新的垃圾时,我希望垃圾的大坝和父亲(妈妈和爸爸)来自我的狗桌,因此两个FK是大坝和父亲。所以在我创造垃圾之前,我必须至少有两个狗条目。

后来,在描述新的狗项时,我想知道狗的窝是否已知,而且那窝应该来自我的垃圾台。不应该要求狗有一窝,但如果该栏不是空的,那么我想知道它。

上面的代码不起作用,但它演示了我想要实现的目标。我很感激有关如何解决这个问题的任何提示。感谢。

2 个答案:

答案 0 :(得分:8)

blank=True告诉管理员,该字段不需要由用户输入。但是你还是tell DB same thing,你需要添加null=True。如果您有循环导入问题,请放置model name as a string

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

如果没有垃圾,该字段将为无。

答案 1 :(得分:0)

使用lazy relationships

在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