如何连接两个外键字段

时间:2017-11-14 08:39:18

标签: python django foreign-keys

我有一个名为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
我的问题是:在某种程度上可以连接模型中的两个外键,或者只转换到一个外键,或者以其他有意义的方式执行此操作。

2 个答案:

答案 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;)