如何从Django模型中的方法中获取值?

tez616oj  于 11个月前  发布在  Go
关注(0)|答案(1)|浏览(92)

如何从Django的模型中的方法中获取值我有两个模型Model1和Model2,Model2与Model1相关,方法位于Model2中,方法名称为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)

字符串
我试着遵循:

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

46scxncf

46scxncf1#

你不需要**,或者至少不需要使用“技巧”将方法“转换”为数据库表达式。
在这个特定的情况下,我们可能有一个字典查找,所以我们可以这样做:

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'))

相关问题