django,contenttype和m2m泛型关系

时间:2012-01-19 11:58:11

标签: python django m2m django-contenttypes

我有以下型号:

  1. 应用
    1. 联络表格
    2. 游戏
    3. 登陆页面
  2. 客户端
  3. 添加新客户端后,我想在客户端下添加新应用程序。为此,我在Clients to Applications下添加了一个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不是很好。这是一个优雅的解决方案吗?或者我应该改变我对问题的观点并以不同的方式做到这一点?

1 个答案:

答案 0 :(得分:0)

注意:我知道这是一个非常古老的问题,但认为有人可能会对此有所帮助

如果每个应用程序模型(或their abstract parent)都有一个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分别为客户提供反向字段。