2014-02-14 3 views
1

관련 필드 유형을 새로 작성하고 싶습니다. 다음은 간단한 예제이다 c = Collection()여러 값을 반환하는 Django "ForeignKey"빌드

class CustomQuerySet(QuerySet): 
    def current(self): 
     return self.filter(invalid_date__isnull=True) 

class CustomManager(Manager): 
    def get_query_set(self): 
     return CustomQuerySet(self.model, using=self._db) 
    def current(self): 
     return self.get_query_set().current() 

class Item(models.Model): 
    objects = CustomManager() 

    row_id = models.IntegerField(primary_key=True) 
    id = models.IntegerField() 
    name = models.CharField(max_length=100) 
    change_date = models.DateTimeField(auto_now_add=True) 
    invalid_date = models.DateTimeField(null=True, blank=True) 


class Collection(models.Model): 
    item = MultipleRelatedField(Item, related_field='id', related_name='collections') 
    name = models.CharField(max_length=100) 

을 감안할 때 :

  • c.itemItem.objects.filter(id=c.item_id)에의 검색어 동등한를 반환해야합니다.
  • 해당 쿼리 세트는 CustomQuerySet 인스턴스 여야합니다.
  • Item.objects.filter(collections__name='SomeName')은 예상대로 작동해야합니다.
  • 작업 Collection.objects.filter(item__name='OtherName', item__invalid_date__isnull=True)이 예상대로 작동해야합니다.

이 내용은 ManyToManyField으로 구현 될 수 있지만 수동으로 항목 개체를 c.item에 추가/제거하고 싶지는 않습니다. c.item은 항상 단일 id 값을 사용하므로 조인 테이블이 필요하지 않습니다. Collection의 기본 키가 아닙니다. c.item은 다른 id 값을 가진 항목 객체를 포함 할 수도 있고 포함하지 않을 수도 있습니다.

나는 django.db.models.fields.related.ForeignRelatedObjectsDescriptor 및/또는 django.db.models.fields.related.ForeignObject (또는 아마도 ManyToMany 해당 항목)을 서브 클래 싱해야 할 필요가 있음을 알고 있습니다.

+0

각 항목은 하나의 컬렉션에 속합니까? 그렇다면'Item' 객체에'Collection'을 가리키는'ForeignKey'가 필요할 것입니다. 'RelatedManager'를 사용하여 역 관계가 제공하는 쿼리 세트를 사용자 정의 할 수 있습니다. –

+0

좋은 질문입니다. 이름이 고안 되었기 때문에'Collection'과 같은 여러 클래스가있을 수 있으며'Item'을 수정하여 각각에 대해 'ForeignKey'를 추가하는 것은 허용되지 않습니다. 'MultipleRelatedField'는 여러 값을 반환하는'ForeignKey' 함수처럼 작동합니다. 그래서 하나 이상의'Collection'이 동일한'id' 값을 참조 할 수 있습니다. –

답변

1

A의 필드 값을 기준으로 다른 모델 B에 대해 모델 A에서 쿼리 세트를 생성하는 자동 방법이 필요합니다.

궁극적으로 해당 쿼리 세트를 A의 필드 값으로 반환하는 것이 실제로 최상의 솔루션은 아니라고 생각합니다. 실제로는 ORM의 입자에 위배되며이를 사용하는 것이 어려울 것입니다. 관리자 또는 다른 일반적인 장소의 모델.

대신 장고 choices 세트 필드를 처리하는 방법에서 아이디어를 가지고 더 나은 것 : 자동으로 파생 된 정보를 반환 모델 클래스의 메소드를 생성 등이 모델은 필드가있는 경우 :

item = MultipleRelatedField(Item, related_field='id', related_name='collections') 

지정한 쿼리 세트를 반환하는 get_item_queryset과 같은 메서드가 자동으로 나타납니다. 당신이 가능성 (여기서 새로운 방법은 것 __init__ 메소드를 오버라이드 (override) (추가 인수를 허용하는)와 contribute_to_class 방법 다음 (아마 좋은 출발점이 될 것입니다 IntegerField) 기존 필드를 서브 클래 싱하고 싶어

그 빌드하려면, 생성). 영감을 얻으려면 the choices-derived get_FIELD_display method here에 대해 이런 일이 일어나는 곳을 볼 수 있습니다.

+0

끔찍한 해결책은 아니지만 조인 문제를 해결하지는 못합니다. –

+0

@AaronMcMillin, "조인 문제"가 무슨 뜻인지 잘 모르겠다. –

+0

This :'Item.objects.filter (collections__name = 'SomeName')'는 Django에 관한 한 관계를 만들지 않기 때문에 솔루션과 함께 작동하지 않습니다. –