Django:按所有模型的pk查询

1 投票
3 回答
501 浏览
提问于 2025-04-17 02:19

我需要通过主键查询多个表,这些主键是唯一的(uuids)。

我的想法是使用模型继承,这样可以一次性查询所有模型。我有一个基础模型叫BaseItem,其他所有模型都是这个BaseItem的子类。

但是,现在我的查询结果并没有我预期的那样。这里有一个示例模型:

from django.db import models
from django.contrib.auth.models import User


class BaseRev(models.Model):
    rev_id = models.CharField(max_length=32, primary_key=True)
    item_id = models.CharField(max_length=32, blank=True, null=True)
    creation_date = models.DateTimeField()


class NamedRev(BaseRev):
    name = models.CharField(max_length=64, blank=True, null=True)
    description = models.CharField(max_length=256, blank=True, null=True)
    creator = models.ForeignKey('UserProfile', related_name='namedrev_creator', blank=True, null=True)

当我创建一个NamedRev,主键为"1234",然后进行这样的查询:

BaseRev.objects.get(pk="1234")

我得到了一个主键正确的结果,但它的类型却是BaseItem。根据文档,这是正常的行为,因为rev_id字段只存在于BaseRev表中,而NamedRev表中有NamedRev的其他字段。

我该如何才能得到“正确的”完整的(包含所有字段)NamedRev对象呢?

谢谢,

Jan

3 个回答

0

你可以在你的基础模型里添加一个“类型”字段,这样你就可以查询这个基础模型,并且知道它的类型。在每个模型里重写 save() 方法,在保存之前设置好类型。

0

如果你把父类设置为抽象类,会发生什么呢:

class BaseRev(models.Model):
    rev_id = models.CharField(max_length=32, primary_key=True)
    item_id = models.CharField(max_length=32, blank=True, null=True)
    creation_date = models.DateTimeField()

    class Meta:
        abstract = True
0

在你获取到你的 BaseRev 之后,接下来做:

>>> base_rev = BaseRev.objects.get(pk="1234")
>>> base_rev.namedrev
<NamedRev: NamedRev object>

把上面的内容赋值给另一个变量,这样你就可以访问 NamedRev 的字段了。

撰写回答