如何从Django模型中的方法中检索值 我有两个模型Model1和Model2,Model2与Model1相关.该方法位于模型2中.方法名称为GET_ORGANIZATION_NAME

class Model1(models.Model):
    code = models.CharField(max_length=5)
    random_id = models.IntegerField(primary_key=True)
    random_type = models.CharField(max_length=5)
    random_code = models.CharField(max_length=10)
    random_name = models.CharField(max_length=200)


class Model2(models.Model):
    id = models.AutoField(primary_key=True)
    claim_id = models.PositiveIntegerField()
    random = models.OneToOneField('Model1', on_delete=models.DO_NOTHING,
                         db_column='random_id', related_name='polis_journal')
    random_type = models.CharField(max_length=255)
    organization_id = models.PositiveIntegerField()

    def get_organization_name(self):
        return polis_organizations.get(self.organization_id, None)

我try 了以下几点:

queryset = Model1.objects.all()
queryset = queryset.annotate(organization_name=F('polis_journal__get_organization_name')

推荐答案

如果不应用"技巧"将方法"转换"成数据库表达式,则至少不会.

在这个特定的例子中,我们可能有一个词典查找,所以我们可以使用:

from django.db.models import Case, Value, When

queryset = Model1.objects.annotate(
    organization_name=Case(
        *[
            When(polis_journal__organization_id=k, then=Value(v))
            for k, v in polis_organizations.items()
        ],
        default=Value(None)
    )
)

但这不仅很难看,而且会导致大的表达式,它将在线性时间内执行词典查找.

通常,我们只在模型中存储组织的名称:

class Organization(models.Model):
    name = models.CharField(max_length=128, unique=True)


class Model2(models.Model):
    # …
    organization = models.ForeignKey(Organization, on_delete=models.PROTECT)

然后我们就可以这样做了:

Model1.objects.annotate(organization_name=F('polis_journal__organization__name'))

Django相关问答推荐

如何在管理页面创建实例时只在ManyToManyField字段中显示超级用户

新的 Django 开发人员无法在网站上显示Hello World,而不是默认安装成功页面

为什么 Django 在错误的目录中寻找模板?

只从查询集中获取某种类型的最新项目

Django rest框架:自定义对象权限不起作用

多租户 Django 应用程序:根据请求更改数据库连接?

Django 视图 - 首先从调用应用程序的目录加载模板

从python中的URL获取查询字符串的最佳方法?

Python / Django 中的 Unicode 与 UTF-8 混淆?

在 django 模板中遇到 user.is_authenticated 问题

将 XML 从 URL 解析为 python 对象

可以在 github 页面上托管 django 站点吗?

Python/Django:从 values_list() 创建一个更简单的列表

Django:创建索引:非唯一,多列

如何在 django 中分离我的模型?

Django:验证上传文件的文件类型

如何使 Django 的开发服务器公开?

AUTH_USER_MODEL 指的是尚未安装和创建的模型 .. AbstractUser 模型无法登录

django.urls.path中name参数的作用是什么?

Django:必须使用对象 pk 或 slug 调用通用详细视图