2012-06-19 75 views
0

我在Django中開發的模型有點複雜。基本的想法是,網站上的用戶可以給予獎勵,但我也想跟蹤用戶與獲獎者之間的關係。用戶可以給同一個人多個獎項,但他們之間只有一個關係。該機型是這個樣子(用戶是標準AUTH_USER模型):管理員在線編輯Django中的多對多關係

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) 

當我嘗試在管理我的錯誤加獎「< class'Relationship'>沒有ForeignKey到< class'Award'>」。我意識到這是因爲當我編輯Award時,Django不知道哪個關係應該被內聯編輯,但實際上對於具有相同用戶/接收者對的人來說顯而易見(對於人)。我無法指定Relationship中的用戶/收件人是關鍵字,因爲Django不支持多列鍵(所以我只能將它們指定爲unique_together)。同樣,我無法指定Award中的用戶/收件人是多列外鍵給Relationship。

有沒有什麼辦法讓我在這裏得到什麼?如果在管理員中與獎勵有多對一關係,則必須單獨編輯關係,這似乎是一個巨大的不便。有沒有更好的方法來組織模型?

回答

1

導致您描述錯誤的基本問題是因爲您無法在'Award'中爲'Relationship'內聯,它應該是另一種方式才能正常工作。這是有道理的,因爲內聯意味着提供創建任意數量的相關記錄(在這種情況下,關係)綁定到您正在編輯的父記錄(一個獎項)的方式,但獎勵只能與一個關係相關使用內聯不起作用。

在任何情況下,我要提出一個有點簡單化的...

我建議完全丟棄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) 

而且,相當比專門管理Award模型上的'關係'值,我會覆蓋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