Python 如何连接两个外键字段

Python 如何连接两个外键字段,python,django,foreign-keys,Python,Django,Foreign Keys,我有一个名为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.

我有一个名为
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')
一个
部分
可以
使用
或/和被
用于另一个
部分
,但我需要知道它是哪一个,以便能够在
详细视图
中显示这一点。换句话说,仅仅知道两个
部分之间存在某种关系是不够的,我需要知道哪种关系。(因此,这两个字段是不同的)。
现在,当另一个对象设置为
used\u in
时,我想更新一个对象中的
uses
,例如:如果
a.uses(b)
我想在(a)
中自动设置
b.used\u
我通过在我的
UpdateView
-->的
form\u valid
方法中手动设置它来实现这一点。例如,如果
a.uses
被更改,请在
中查找
b
并更改其
used\u
例如:

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()
然而,这有几个缺点。首先,我真的不喜欢手工操作,我想知道是否可以用其他方法来完成,但我在谷歌上没有找到任何东西。第二个问题是,一个
部分
可以使用其他几个
部分
,但使用我的方法,只显示使用的
最后一个
部分。

我的问题是:是否有可能在模型中连接两个外键,或者只切换到一个外键,或者以其他有意义的方式执行此操作。

如果要在同一个表中创建父子关系。无需创建两个字段,因为
字段中的
used\u引用的是您正在更新的同一对象

更新

假设零件类有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
字段,并使用
字段中的just
used.

。无需创建两个字段,因为
字段中的
used\u引用的是您正在更新的同一对象

更新

假设零件类有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
字段,并使用
字段中的just
used.

您可以尝试以下格式:

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='Part\u to\u find')

搜索包含子部分的部分:Partused.objects.filter(mainpart='Part\u ID')


搜索属于其他零件子零件的零件:Partused.objects.filter(子部分='Part_ID')

您可以尝试以下格式:

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='Part\u to\u find')

搜索包含子部分的部分:Partused.objects.filter(mainpart='Part\u ID')


搜索其他部分的子部分:Partused.objects.filter(子部分='Part_ID')

但是我仍然需要区分使用另一个或正在使用的
部分,我该怎么做?你能解释一下你的用例吗,为什么你需要额外的字段。就像我上面解释的,用户应该可以选择在
中将零件标记为
使用
使用_,并且在引用对象中,应设置其他字段。如果我没有两个字段,我如何知道使用了哪个部分和使用了哪个部分?检查我的更新部分,我希望这能让事情变得清楚。但是如果我这样做,用户需要能够为每个对象指定
使用
和/或
使用
,只有在
中使用的
才会显示在更新视图中,不是吗?这意味着,如果他正在创建Part3,并且他想让它使用Part4,他必须先保存它,然后转到Part4并在那里更改它?但是我仍然需要区分使用另一个或正在使用的
部分,我该怎么做?你能解释你的用例吗,为什么你需要额外的字段。嗯,就像我上面解释的一样,用户应该可以选择在
中将零件标记为
使用
使用_,并且在引用对象中,应设置其他字段。如果我没有两个字段,我如何知道使用了哪个部分和使用了哪个部分?检查我的更新部分,我希望这能让事情变得清楚。但是如果我这样做,用户需要能够为每个对象指定
使用
和/或
使用
,只有在
中使用的
才会显示在更新视图中,不是吗?这意味着,如果他正在创建Part3,并且他想让它使用Part4,他必须先保存它,然后转到Part4并在那里更改它?a_使用_b=a.uses(b)和b_使用_by=b.uses_set,如果我这样做,我可以在以后区分uses和is_使用?a_使用_b=a.uses(b)b_used_by=b.uses_set,如果我这样做,我可以在之后区分uses和is_used?