我有两个应用程序 - 一个用于狗,一个用于垃圾 - 理想情况下我会将外键互相支持,如下所示:
在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是大坝和父亲。所以在我创造垃圾之前,我必须至少有两个狗条目。
后来,在描述新的狗项时,我想知道狗的窝是否已知,而且那窝应该来自我的垃圾台。不应该要求狗有一窝,但如果该栏不是空的,那么我想知道它。
上面的代码不起作用,但它演示了我想要实现的目标。我很感激有关如何解决这个问题的任何提示。感谢。
答案 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)
在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