[英]How to connect two Foreign Key Fields
我有一個名為Part
的model
,看起來像這樣:
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
。 of relationship. 換句話說,這是不夠的,知道有某種兩者之間關系的Parts
,我需要知道是的關系。 (因此這兩個不同的字段)。 現在,當另一個對象設置為used_in
時,我想更新一個對象的uses
,例如:如果a.uses(b)
我想自動設置b.used_in(a)
。
我通過在手動設置它這樣做form_valid
我的方法UpdateView
- >例如,如果a.uses
改變,尋找b
,並改變其used_in
。
例如:
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()
但是,這有幾個缺點。 首先,我真的不喜歡必須手動執行此操作,並且想知道是否可以通過其他方式完成此操作,但是我在Google上找不到任何內容。 第二個問題是,一個Part
可以使用其他幾個Parts
,但我的方法,只有最后一個Part
是used
顯示。
我的問題是:是否可以以某種方式連接模型中的兩個外鍵,或僅移至一個外鍵,還是以其他有意義的方式執行此操作。
如果要在同一表中創建父子關系。 無需創建兩個字段,因為used_in
字段引用您要更新的同一對象。
UPDATE
假設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
字段。
您可以嘗試以下格式:
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_to_find')
具有子部分的搜索部分:Partused.objects.filter(mainpart ='Part_ID')
搜索部分是其他部分的子部分:Partused.objects.filter(subpart ='Part_ID')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.