gpt4 book ai didi

python - Django 计算字段不会出现在迁移中

转载 作者:行者123 更新时间:2023-12-03 22:15:16 26 4
gpt4 key购买 nike

我正在使用 Django 中的示例 docs并尝试在 Django 模型中创建计算字段。但是,这些字段不会出现在迁移中,当然也不会出现在数据库中。

这是我的models.py

from django.db import models

class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
birth_date = models.DateField()

def baby_boomer_status(self):
"Returns the person's baby-boomer status."
import datetime
if self.birth_date < datetime.date(1945, 8, 1):
return "Pre-boomer"
elif self.birth_date < datetime.date(1965, 1, 1):
return "Baby boomer"
else:
return "Post-boomer"

@property
def full_name(self):
"Returns the person's full name."
return '%s %s' % (self.first_name, self.last_name)

和迁移文件:
class Migration(migrations.Migration):

initial = True

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name='Person',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=50)),
('last_name', models.CharField(max_length=50)),
('birth_date', models.DateField()),
],
),

我是否误解了 property 属性?如果是这样,如何让计算字段出现在数据库中?

最佳答案

那么那些“计算字段”不会在数据库级别存储或计算。事实上,数据库根本不了解 Python 类(或 Django 模型)。

那些@property s 实际上是在类级别定义的方法。这意味着如果有人查询 some_person.full_name ,Python会在方法中进行计算,并返回结果。如果必要的属性之一发生变化(可以说是“成分”),则该属性的结果也会发生变化(当您再次获取它时)。

另一个含义是你不能.filter(..)在这样的属性(property)上。数据库不知道是什么full_name意味着,因此您可以例如不指定 Person.objects.filter(full_name__icontains='Bob') ,因为该字段及其对应的值未存储在数据库中。

由于数据库与属性(或非列属性或方法)无关,因此这些不包括在迁移中。

如果您需要数据库级别的那些(例如对其进行过滤),您可以执行 .annotate(..)在您的查询集中。但是,您必须将相应的逻辑编码到数据库表达式中。这可能很困难、很麻烦,甚至不可能(例如,如果该属性在文件系统上执行操作,或查询 Web 服务,因为大多数数据库不支持此类操作)。

关于python - Django 计算字段不会出现在迁移中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51423488/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com