【问题标题】:django, contenttype and m2m generic relationsdjango、contenttype 和 m2m 通用关系
【发布时间】:2012-01-19 11:58:11
【问题描述】:

我有以下型号:

  1. 应用
    1. 联系表格
    2. 游戏
    3. 登陆页面
  2. 客户

添加新客户端后,我想在客户端下添加新应用程序。为此,我在 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 不是很好。有没有一个优雅的解决方案?或者我应该改变对问题的看法并以不同的方式解决问题?

【问题讨论】:

  • 你好,据我所知,这个“t = Client.objects.get()”不会产生任何输出,因为 objects.get() 没有参数。您的应用程序模型有一个通用外键,可以将其附加到您创建的任何其他模型(即联系表单、游戏、登录页面)。可以更准确一点,您要实现哪个目标?
  • 之所以有效,是因为我已经使用该模型添加了一个对象。 get() 就像你写了 get(pk=1)
  • 我认为应用程序模型类是其他应用程序(联系表单等)的容器,因此我可以通过 m2m 关系将它们一一添加到客户端模型类。
  • t.applications.all() 应该检索所有 m2m 相关对象,如果有任何附加。我不明白为什么这不应该工作,除非没有应用程序附加到 pk=1 的客户端。

标签: python django m2m django-contenttypes


【解决方案1】:

注意:我知道这是一个非常古老的问题,但认为有人可能会从中受益

如果每个应用程序模型(或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 向客户端提供反向字段。

【讨论】:

    猜你喜欢
    • 2014-04-29
    • 2016-05-07
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2014-08-16
    相关资源
    最近更新 更多