簡體   English   中英

Django,ContentType和M2M通用關系

[英]django, contenttype and m2m generic relations

我有以下型號:

  1. 應用
    1. 聯系表
    2. 游戲
    3. 登陸頁面
  2. 客戶

添加新的客戶端后,我想在客戶端下添加新的應用程序。 為此,我在“客戶端”下為應用程序添加了一個m2m字段,如下所示:

applications = models.ManyToManyField(Application, verbose_name=u'Applications')

由於應用程序可以是任何東西,因此我發現我需要使用contenttype框架。 因此,我將以下內容放在應用程序模型下:

applicationContentType = models.ForeignKey(ContentType)
applicationId = models.PositiveIntegerField()
application = generic.GenericForeignKey('applicationContentType', 'applicationId')

這樣,我可以通過選擇內容類型(在這種情況下為內容表單)並鍵入現有的聯系表單ID來添加新的應用程序。 我可以在管理頁面的“客戶的m2m”字段中看到它。

但是,當我執行以下操作時,看不到我剛剛添加到客戶端的應用程序:

In [2]: t = Client.objects.get()
In [3]: t.applications.all()
Out[3]: []

而且必須記住新添加的聯系表單的ID並不是很好。 是否有一個優雅的解決方案? 還是應該改變我對問題的看法並以其他方式解決?

注意:我知道這是一個非常老的問題,但以為有人可能會對此有所幫助

如果每個應用程序模型(或其abstract父級 )都具有一個指向客戶端的m2m密鑰,那么您所描述的內容將非常有效。 除非絕對必要,否則我不建議您使用通用外鍵(相信我,您稍后會感謝我)。

例如,采用一個應用程序模型:

class Application(models.Model):
    class Meta:
        abstract = True

    field1 = ...
    field2 = ...

    client = models.ManyToManyField('clients.Client',
                                    related_name="related_%(class)s")

使用這種方法,您將分別通過related_gamesrelated_contactformsrelated_landingpages向客戶端提供反向字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM