我有一个名为model
的{{1}},如下所示:
Part
一个class Part(model.Model) =
some attributes...
uses = models.ForeignKey('self', null = True, blank = True, on_delete = models.SET_NULL, limit_choices_to={'used_in' : None}, related_name = 'part_uses')
used_in = models.ForeignKey('self', null = True, blank = True, on_delete = models.SET_NULL, related_name = 'device_used_in')
可以Part
或/和use
另一个used_in
,但我需要知道它们中的哪一个,才能在Part
。换句话说,它不足以知道两个DetailView
之间存在某种关系,我需要知道哪种种的关系。 (因此两个不同的领域)。
现在,我想在一个对象中更新Parts
,当另一个对象设置为uses
时,例如:used_in
我要自动设置a.uses(b)
。
我是通过在b.used_in(a)
- >的form_valid
方法中手动设置来完成此操作的。例如,如果更改UpdateView
,请查找a.uses
并更改其b
例如:
used_in
然而,这有几个缺点。首先,我不是真的想要手动执行此操作,并且想知道这是否可以通过其他方式完成,但我在Google上找不到任何内容。第二个问题是一个if 'used_in' in form.changed_data:
if self.object.used_in:
other_device = Device.objects.filter(pk= self.object.used_in.pk)[0]
other_device.uses = self.object
other_device.save()
可以使用其他几个Part
,但是使用我的方法,只会显示Parts
的最后一个Part
。
我的问题是:在某种程度上可以连接模型中的两个外键,或者只转换到一个外键,或者以其他有意义的方式执行此操作。
答案 0 :(得分:2)
如果要在同一个表中创建父子关系。无需创建两个字段,因为used_in
字段引用了您正在更新的同一对象。
<强>更新强>
假设Part类有4个对象。
# first part
>>> part1 = Part.objects.create(name="car engine")
# second part
>>> part2 = Part.objects.create(name="Spark plug")
# third part
>>> part3 = Part.objects.create(name="Piston")
# fourth part
>>> part4 = Part.objects.create(name="Piston rings")
# mark part1 uses part2 and part3.
>>> part2.used_in = part1
>>> part2.save()
>>> part3.used_in = part1
>>> part3.save()
# find parts used in part1.
>>> Part.objects.filter(used_in=part1)
# find part3 is child of which part.
>>> part3.used_in
# mark part3 uses part4
>>> part4.used_in = part3
>>> part4.save()
# this means part1 uses part3 and part3 using part4
您可以删除uses
字段并仅使用used_in
字段。
答案 1 :(得分:1)
您可以尝试以下格式:
class Parts(models.Model):
title = models.CharField(u'Store_Title', max_length=100)
def __str__(self):
return self.title
class Partused(models.Model):
mainpart = models.ForeignKey('Parts', null = True, blank = True, on_delete = models.SET_NULL, related_name = 'mainpart')
subpart = models.ForeignKey('Parts', null = True, blank = True, on_delete = models.SET_NULL, related_name = 'subpart')
def __str__(self):
return self.mainpart.title + 'uses --> ' + self.subpart.title
搜索零件:Parts.objects.get(title =&#39; Part_to_find&#39;)
搜索具有子部件的部件:Partused.objects.filter(mainpart =&#39; Part_ID&#39;)
搜索部件是其他部件的子部件:Partused.objects.filter(subpart =&#39; Part_ID&#39;)