2012-06-19 4 views
0

장고에서 개발중인 모델과 다소 복잡한 상황이 있습니다. 기본 아이디어는 사이트의 사용자가 사람들에게 상을 줄 수 있지만 사용자와 수상자 간의 관계를 추적하기를 원합니다. 사용자는 동일한 사람에게 여러 가지 상을 줄 수 있지만 그 사이에는 하나의 관계 만 있습니다.관리자가 장고에서 다 대다 관계의 인라인 편집

class Recipient(models.Model): 
    name = models.CharField(max_length=255) 
    senders = models.ManyToManyField(User, through='Relationship') 

class Relationship(models.Model): 
    user = models.ForeignKey(User) 
    recipient = models.ForeignKey(Recipient) 
    relationship = models.CharField(max_length=255, blank=True, default='') 
    class Meta: 
     unique_together = (('user', 'recipient'),) 

class Award(models.Model): 
    recipient = models.ForeignKey(Recipient) 
    user = models.ForeignKey(User) 
    relationship = models.ForeignKey(Relationship) 
    award_name = models.CharField(max_length=255) 

내가 오류를 얻을 관리자에 상을 추가하려고하면 내가

class RelationshipInline(admin.StackedInline): 
    model = Relationship 

class AwardAdmin(admin.ModelAdmin): 
    inlines = [RelationshipInline] 
    exclude = ['relationship'] 

admin.site.register(Recipient) 
admin.site.register(Award, AwardAdmin) 

같은 것을 가지고있는 관리자에서 다음 모델은 (사용자가 표준 AUTH_USER 모델입니다)이 같을 "< 클래스 '관계'>에는 < 클래스 'Award'>"에 대한 ForeignKey가 없습니다. 장고를 편집 할 때 Django는 어떤 관계가 인라인으로 편집되어야하는지 알지 못하지만 실제로는 동일한 사용자 /받는 사람 쌍을 가진 사람이라는 점이 분명합니다 (사람에게). Django는 다중 열 키를 지원하지 않기 때문에 관계에있는 사용자 /받는 사람이 키라는 것을 지정할 수 없습니다 (그래서 내가 할 수있는 것은 unique_together로 지정하는 것입니다). 마찬가지로, Award의 사용자/수신자가 관계에 대한 다중 열 외래 키라는 것을 지정할 수 없습니다.

내가 여기에 도착하려고하는 방법이 있습니까? 보너스에서 다 대일 관계가있을 때 관리자에서 관계를 개별적으로 편집해야하는 것은 큰 불편입니다. 모델을 구성하는 더 좋은 방법이 있습니까?

답변

1

당신이 설명한 오류를 일으키는 기본적인 문제는 '수상'에서 '관계'에 대한 인라인을 할 수 없기 때문에 다른 방법으로 제대로 작동해야합니다. 인라인은 편집중인 상위 레코드 (상)에 바인딩 된 임의의 수의 관련 레코드 (이 경우 관계)를 만들 수있는 수단을 제공하기위한 것이기 때문에 의미가 있습니다. 그러나상은 하나의 관계에만 관련 될 수 있습니다. 인라인을 사용하면 작동하지 않습니다. 어떤 경우

, 나는 ... 단순화의 조금을 제안거야

내가 완전히 Recipient 모델을 삭제하고 이런 식으로 전환 제안

: 오히려,

class Relationship(models.Model): 
    user1 = models.ForeignKey(User) 
    user2 = models.ForeignKey(User) 
    relationship = models.CharField(max_length=255, blank=True, default='') 
    class Meta: 
     unique_together = (('user1', 'user2'),) 

class Award(models.Model): 
    recipient = models.ForeignKey(User) 
    user = models.ForeignKey(User) 
    relationship = models.ForeignKey(Relationship) 
    award_name = models.CharField(max_length=255) 

과 보너스 모델의 '관계'값을 구체적으로 관리하는 것보다 save() 메서드를 재정 의하여 2 명의 사용자 관계를 가져 오거나 만들면됩니다. 그러면 다음과 같이 표시됩니다 (테스트되지 않음).

... 
from django.db.models import Q 
... 
class Award(models.Model): 
    ... 
    def save(self, *args, **kwargs): 
     try: 
      # Query for an existing relationship between the 2 users in question... 
      relationship = Relationship.objects.get(
       (Q(user1=self.recipient) & Q(user2=self.user)) | (Q(user1=self.user) & Q(user2=self.recipient)) 
      ) 
     except: 
      relationship = Relationship.objects.create(user1=self.recipient, user2=self.user, relationship='Pals') 
     self.relationship = relationship 
     super(Award, self).save(*args, **kwargs) 
+0

고마워요. 수신자는 등록 된 사이트 사용자 일 필요가 없으므로 해당 모델을 제거하는 데는 효과가 없을 것입니다.하지만이를 개선하기 위해 save 메소드를 재정의 할 것입니다. – sagittarian

관련 문제