2017-11-14 5 views
0

를 연결하는 model 다음과 같습니다 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') 

Partuse 및/또는 used_in 다른 Part 일을하지만 그것이 그들의 알아야합니다을 , 이것을 DetailView에 표시 할 수 있습니다. 즉, 두 가지 사이에 어떤 종류의 관계가 있다는 것을 아는 것만으로는 충분하지 않습니다. Parts을 알고 싶습니다. 종류의 관계입니다. (따라서 두 개의 다른 필드). 이제 한 객체에서 uses을 업데이트하고 다른 객체가 used_in으로 설정되면 예 : a.uses(b)b.used_in(a)을 자동으로 설정하고 싶습니다.
UpdateView 예를 들어 a.uses이 변경되면 form_valid 방법으로 수동 설정하여 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 만 표시된다는 것입니다.
제 질문은 모델 내부에있는 두 개의 외래 키를 연결하거나 한 개의 외래 키로 이동하거나 다른 방식으로 수행하는 것이 가능하다는 것입니다.

+0

a_uses_b = a.uses (b) 및 b_used_by = b.uses_set – Vaibhav

+0

그리고 내가 이것을하면 나중에 사용과 is_used 사이를 구별 할 수 있습니까? – LizzAlice

답변

2

동일한 테이블에 상위 하위 관계를 만들려는 경우. used_in 필드가 업데이트중인 동일한 개체를 참조하므로 두 필드를 만들 필요가 없습니다.

UPDATE

은 가정하자 일부 클래스의 사 명 목적이있다.

# 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 필드를 사용할 수있다.

당신은이 형식을 시도 할 수 있습니다
+0

하지만 여전히 다른 파트를 사용하거나 사용되는 '파트'를 구별해야합니다. 어떻게해야합니까? – LizzAlice

+0

당신은 당신의 유스 케이스를 설명 할 수 있습니다, 왜 당신은 여분의 필드가 필요합니다. – Satendra

+0

글쎄, 위에서 설명한 것처럼, 사용자는 Part를'uses' 또는 'used_in'로 표시 할 수있는 옵션을 가져야하고 참조 된 객체에서는 다른 필드를 설정해야합니다. 두 개의 필드가없는 경우 Part가 사용하는 부품과 사용 된 Part를 어떻게 알 수 있습니까? – LizzAlice

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 (제목 = 'Part_to_find')

하위 부분이

검색 부 : Partused.objects.filter (mainpart = 'Part_ID')

다른 부분에 하위 부분이다

검색 부 : Partused.objects.filter (서브 파트 = 'Part_ID')