簡體   English   中英

如何連接兩個外鍵字段

[英]How to connect two Foreign Key Fields

我有一個名為Partmodel ,看起來像這樣:

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 ,但我的方法,只有最后一個Partused顯示。
我的問題是:是否可以以某種方式連接模型中的兩個外鍵,或僅移至一個外鍵,還是以其他有意義的方式執行此操作。

如果要在同一表中創建父子關系。 無需創建兩個字段,因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM