【问题标题】:Django - Is it possible in a intermediate table to use an inherited ForeignKey for the target model?Django - 是否可以在中间表中为目标模型使用继承的 ForeignKey?
【发布时间】:2014-07-28 14:20:51
【问题描述】:

我使用的是 django 1.4,我有以下模型:

class Newsletter(EmailTemplate):
    receivers = models.ManyToManyField(User, related_name='newsletters',
                                       db_index=True,
                                       through='NewsletterReceiver')

class EmailReceiver(models.Model):
    user = models.ForeignKey(User, db_index=True)

class NewsletterReceiver(EmailReceiver):
    newsletter = models.ForeignKey(Newsletter, db_index=True)

当我通过执行以下操作在视图中创建 Newsletter 对象时:

newsletter = form.save(commit=False)
newsletter.receivers.clear()
receivers = form.cleaned_data['receivers']
for receiver in receivers:
    newsletter_receiver = NewsletterReceiver(user=receiver, newsletter=newsletter)
    newsletter_receiver.save()

form.save_m2m()
newsletter.save()

我可以看到Newsletter 对象和NewsletterReceiver 对象都已创建。使用ipython,如果我从新创建的NewsletterReceiver 查询usernewsletter,一切都很好,但是如果我从Newsletter 实例查询接收者,那么django 会抱怨我不明白的事情:

In [2]: nr = NewsletterReceiver.objects.all()[0]

In [3]: nr.user
Out[3]: <User: 3>

In [4]: nr.newsletter
Out[4]: <Newsletter: Newsletter object>

In [5]: nr.newsletter.receivers
Out[5]: <django.db.models.fields.related.ManyRelatedManager at 0x10ea26f90>

In [6]: nr.newsletter.receivers.all()
Out[6]: 
<repr(<django.db.models.query.QuerySet at 0x10ee860d0>) failed:
django.db.utils.DatabaseError: column web_newsletterreceiver.user_id does not exist
LINE 1: ...N "web_newsletterreceiver" ON ("auth_user"."id" = "web_newsl...
                                                         ^
>

这是因为目标模型的ForeignKey 被继承了吗?是否有解决方法或者我应该重构模型?

【问题讨论】:

    标签: python django django-models django-inheritance


    【解决方案1】:

    one2many 的关系是可能的,如果有primary_key。就像你加入 2 个表一样,你必须按照加入顺序给出 primary_key。

    请在模型中添加一个主键。

    当您尝试使用all() 函数检索数据时,它将尝试加入主键。

    【讨论】:

    • 您能详细说明一下吗?如果问题出在primary_key 的定义中,为什么我删除EmailReceiver 模型并将user 字段直接移动到NewsletterReceiver 模型中,一切都按预期工作而不定义任何主键?
    【解决方案2】:

    我通过添加解决了它:

    class Meta:
        abstract = True
    

    EmailReceiver 模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 2011-04-21
      • 2013-02-19
      • 2011-09-12
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      相关资源
      最近更新 更多