繁体   English   中英

不能分配“<User: user.name> : 必须是“用户”实例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM