![](/img/trans.png)
[英]ValueError: Cannot assign “<User: username>”: “MessageModel.user_name” must be a “Room” instance
[英]Cannot assign “<User: user.name>: must be a ”User" instance
我在编写自定义 django 迁移时遇到问题,我试图为用户设置模型的字段值。 有问题的模型如下所示(CustomerMachine)。 该模型使用 django-simple-history 模块来跟踪模型实例的变化。 我正在尝试查询迁移中的实例历史记录并将 review_submitter 值设置为最后一个编辑实例的用户。 历史查询 history_user 的结果返回 <class 'django.contrib.auth.models.User'> 类型,但是当我尝试将 review_submitter 设置为该值时,我收到以下错误: ValueError: Cannot assign "<User: user.name>": "CustomerMachine.review_submitter" 必须是一个 "User" 实例。 对这里发生的事情有任何见解吗?
简化类示例
class CustomerMachine(models.Model):
review_submitter = models.ForeignKey(settings.AUTH_USER_MODEL, default=None)
history = HistoricalRecords()
自定义迁移
from __future__ import unicode_literals
from __future__ import absolute_import
from django.conf import settings
from django.db import migrations, models
from django.contrib.auth.models import User
from acceptance.models import CustomerMachine
def set_submitter(apps, schema_editor):
machines = apps.get_model('acceptance', 'CustomerMachine')
for machine in machines.objects.all():
history = CustomerMachine.history.filter(serial=machine.serial)
if history:
history_user = history.last().history_user
machine.review_submitter = history_user
machine.save()
def reverse_func(apps, schema_editor):
pass # code for reverting migration, if any
class Migration(migrations.Migration):
dependencies = [
('acceptance', '0031_auto_20200914_1611'),
]
operations = [
migrations.RunPython(set_submitter, reverse_func),
]
迁移 0031_auto_20200914_1611
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('acceptance', '0030_auto_20191218_1927'),
]
operations = [
migrations.AddField(
model_name='customermachine',
name='review_submitter',
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='historicalcustomermachine',
name='review_submitter',
field=models.ForeignKey(blank=True, db_constraint=False, default=None, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL),
),
]
问题是您试图将模型直接导入迁移:
from acceptance.models import CustomerMachine
在迁移中,您只能获得这样的模型:
machines = apps.get_model('acceptance', 'CustomerMachine')
这个模型可以在以后使用:
history = machines.history.filter(serial=machine.serial)
代替:
history = CustomerMachine.history.filter(serial=machine.serial)
问题是,在迁移中,您无法访问具有状态的经典模型,并且当您执行machines = apps.get_model('acceptance', 'CustomerMachine')
您将获得<class '__fake__.CustomerMachine'>
这不是您的CustomerMachine
(您可以在迁移中检查 pdb)。 当您尝试将标准模型与“假”等价物混合时,就会出现您描述的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.