Django - 是否可以在中间表中使用继承的ForeignKey?

0 投票
2 回答
1001 浏览
提问于 2025-04-18 15:03

我正在使用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 是继承来的原因吗?有没有什么解决办法,或者我需要重构这些模型吗?

2 个回答

0

one2many 关系是指一种数据关系,通常需要有一个 primary_key(主键)来实现。就像你在连接两个表格时,必须在连接的顺序中指定主键。

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

当你尝试使用 all() 函数来获取数据时,它会尝试根据主键来进行连接。

0

我通过添加以下内容解决了这个问题:

class Meta:
    abstract = True

EmailReceiver 模型中。

撰写回答