2016-09-12 2 views
0

은 여분의 데이터가 저장되지 않도록주문이 모델을 통해

class Membership(models.Model): 
    person = models.ForeignKey(Person, on_delete=models.CASCADE) 
    group = models.ForeignKey(Group, on_delete=models.CASCADE) 
    order = models.PositiveIntegerField() 

    class Meta: 
     ordering = ('order',) 

처럼 보이게하기 위해 Membership 모델을 변경, 장고의 example of using a "through" model은 다 대다 관계를 추가 데이터를 지정하는 고려와 다 대다을 장고 에 Person의 순서를 지정하는 순서 매개 변수입니다.

name 발주 나머지 Person 인스턴스 (아닌 그룹) 다음 order 발주 그룹에 우선 Person 인스턴스를 포함하는 소정의 Group위한 검색어 세트를 획득하고자 내.

나는이 검색어 세트가 예상되는 사람의 인스턴스를 포함하는 표시 할

# Get all beatles members ordered by the through model 
qs1 = beatles.members.all().order_by('membership__order') 
# Get the remaining Persons (those not in the beatles) ordered by name 
qs2 = Person.objects.exclude(id__in=qs1).order_by('name') 

처럼,이 개 검색어 세트와 함께이 작업을 수행 할 수 있습니다. 그러나 queryset 인스턴스를 필요로하는 양식 필드를 초기화하기 위해 먹이를주고 싶기 때문에 결합 된 queryset이 ​​목록이나 일부 itertools "chain"개체가 아니라 필요합니다.

나는

result_qs = qs1 | qs2 

을 시도했지만 나는 노조가 중복을 제거했는데 생각에도 불구하고 ( result_qs 중복을 포함 할 수 ?? 왜이 때때로 경우에도 Qs1으로 경우에 할 수 있는가?이와 중복 찾기 qs2는 겹치지 않습니다 !!).

내가

result_qs = (qs1 | qs2).distinct() 

을 할 경우 작동하도록 보인다,하지만 난 내가 무엇을하고있어 항상 작동하는 것, 이것을 달성하는 좋은 방법입니다 경우 의심스러운입니다.

참고 : Person.objects.all().order_by('membership__order')을 수행하면 Person 인스턴스가 구성원 인 각 Group에 대해 Person 개의 인스턴스가 중복됩니다. 코멘트에서

+0

모든 사람을위한 단지 검색과 동일하지 않습니다 위 그룹을 혼합? "비틀즈에 속한 사람들"과 "비틀즈에 속하지 않은 사람들"? – raratiru

+0

@raratiru 무슨 뜻인지 예를 들어 주시겠습니까? 나는 첫 번째'qs1'의 순서가 문제라고 생각한다. – fpghost

+0

그룹 "beatles"에있는 것들이 "order"필드에 의해 정렬되고 비틀즈에없는 것들은 기본적으로 정렬됩니다 (name/id). – fpghost

답변

0

업데이트 : 내가 하나에 두 개의 쿼리를 혼합 부분적를 주문 질문에서 내 첫 코멘트에서 언급 한 것처럼

에 대해 "두 계층"order_by 속성을 요청하는 것과 같다 다음 쿼리 :

Membership.objects.all()

나는이 현재 지원되는지 모르겠습니다. 내가하고 싶은 것은 모든 사람이 개체의 집합

from django.db import models 

# Create your models here. 

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person, on_delete=models.CASCADE) 
    group = models.ForeignKey(Group, on_delete=models.CASCADE) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 
    order = models.PositiveIntegerField() 

    def __str__(self): 
     return '{0}: {1} (order {2})'.format(self.group, self.person, self.order) 

    class Meta: 
     ordering = ('order',) 

입니다 같은 명령 :/models.py이

비틀즈 :


이 가상의 응용 프로그램에서 우리의 모델은 Beatles라고 그 "beatles"그룹에있는 사람들은 "order"필드에 의해 정렬됩니다.

는의는 구성원 변수를 준비하자

$manage.py shell 

>>>from beatles.models import Membership 
>>>memberships = Membership.objects.all().select_related('person', 'group') 

이제 우리는 우리의 필요에 따라 변수 구성원을 조작하는 것입니다. 모델 class Meta 필요에 따라 주문한 모든 비틀즈 멤버를 찾을 수 있습니다 :

>>>beatles_membership_results = memberships.filter(group__name='Beatles') 
>>>beatles_membership_results 
<QuerySet [<Membership: Beatles: Ringo (order 1)>, <Membership: Beatles: Paul (order 2)>]> 

, 그리고 비틀즈에없는 것들 기본적 (이름/ID)에 의해 정렬됩니다.

다른 모든 회원이 있으며 그룹 ID로 주문합니다. 결과에서 두 개의 다른 그룹에 속하기 때문에 조지를 두 번 발견 할 것입니다.

>>>general_membership_results = memberships.exclude(group__name='Beatles').order_by('group__id') 
>>>general_membership_results 
<QuerySet [<Membership: Daring Flowers: George (order 3)>, <Membership: Misty November: Lulu (order 4)>, <Membership: Daring Flowers: Terrenton (order 5)>, <Membership: Misty November: George (order 6)>]> 

당신은 그들의 이름을 주문할 수 있습니다

>>>general_membership_results = memberships.exclude(group__name='Beatles').order_by('person__name') 
>>>general_membership_results 
<QuerySet [<Membership: Daring Flowers: George (order 3)>, <Membership: Misty November: George (order 6)>, <Membership: Misty November: Lulu (order 4)>, <Membership: Daring Flowers: Terrenton (order 5)>]> 
+0

두 개의 단일 쿼리 집합을 찾고 있지 않습니다. 너가 나의 OP를 검사하면, 나는 이미 2 개의 단 하나를 독립해서 달성했다 (첫번째로 주문되는 비틀의 일원이고 두번째는 비틀즈에 이름이없는 모든 사람이다). 내가 필요한 것은이 두 가지를 주어진 주문과 결합시킨 단일 쿼리 세트입니다. – fpghost

+0

@fpghost 나는 내 대답을 - 적절하게 업데이트했다. – raratiru