2014-09-02 83 views
2

我有以下代碼:假反向關係

class Transaction(models.Model): 
    pass 

class Shipment(models.Model): 
    tx = models.ForeignKey(Transaction) 
    sub = models.ForeignKey(Subscription) 


class Subscription(models.Model): 
    pass 

我試圖做這樣的認購和成交之間的反向關係:

subscription.transaction_set.all() 

我能來的唯一方法與是使用像這樣的假財產:

class Subscription(models.Model): 

    @property 
    def transaction_set(self): 
     return Transaction.objects.filter(
      pk__in=[s.tx.pk for s in self.shipment_set.all()] 
     ) 

但現在我已經反對管理問題。我想列出管理網站中使用admin.TabularInline的交易。這是我的解決方案崩潰的地方。有人有什麼主意嗎?

我還需要使用admin.TabularInline列出貨件。

回答

3

你正在尋找的形式through說法:

class Transaction(models.Model): 
    pass 

class Subscription(models.Model): 
    transactions = models.ManyToManyField(Transaction, through='Shipment') 

class Shipment(models.Model): 
    tx = models.ForeignKey(Transaction) 
    sub = models.ForeignKey(Subscription) 

然後:

subscription.transactions.all() 
+0

我無法相信我錯過了。我認爲,因爲在我的腦海中,我已經構建了它,並且我沒有意識到裝運模型已經像一個貫穿模型一樣起作用。謝謝。 – 2014-09-02 15:27:01

+0

我想我可能已經匆匆接受了這個答案。關係有效,但我收到以下錯誤::(admin.E202)'sagepay.Transaction'沒有ForeignKey到'subscription.Subscription'。這是我之前得到的同樣的錯誤。 – 2014-09-02 15:41:37

+0

http://stackoverflow.com/a/6480089/842935 – danihp 2014-09-02 15:44:42