【问题标题】:Django: ValueError: Cannot assign "<User: x>": "UserRelatinoship.x" must be a "User" instanceDjango:ValueError:无法分配“<User:x>”:“UserRelatinoship.x”必须是“User”实例
【发布时间】:2021-09-26 17:26:06
【问题描述】:

我正在尝试在 Django 的迁移中自动创建两个测试用户之间的关系。我的迁移代码如下所示:

# Generated manually

from django.db import migrations, transaction
from django.contrib.auth import get_user_model


def setup_test(apps, schema_editor):
    User = get_user_model()
    User.objects.create_superuser("admin", "admin@gm.org", "123")
    x = User.objects.create_user(
        username="x", email="a@gm.org", password="123"
    )
    y = User.objects.create_user(
        username="y", email="b@gm.org", password="123"
    )
    UserRelatinoship = apps.get_model("myapp", "UserRelatinoship")
    UserRelatinoship.objects.create(x=x, y=y, active=True)


class Migration(migrations.Migration):

    dependencies = [
        ("myapp", "0001_initial"),
        ("myapp", "0002_manual"),
    ]

    operations = [
        migrations.RunPython(setup_test),
    ]

型号代码

from django.contrib.auth import get_user_model

User = get_user_model()

class UserRelationship(models.Model):
    class Meta:
        unique_together = (("x", "y"),)

    x = models.ForeignKey(User, related_name="x", on_delete=models.CASCADE)
    y = models.ForeignKey(User, related_name="y", on_delete=models.CASCADE)
    active = models.BooleanField(default=True)
    cancelled = models.BooleanField(default=False)
    approved = models.BooleanField(default=False)
    denied = models.BooleanField(default=False)
    finalized = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        if self.approved:
            self.active = True
        if self.cancelled:
            self.active = False
        super().save(*args, **kwargs)

    def __str__(self):
        return f"{self.x}:{self.y}"

用户创建得很好,但是当我尝试创建关系时,我收到错误ValueError: Cannot assign "&lt;User: x&gt;": "UserRelatinoship.x" must be a "User" instance.。此外,我可以在运行服务器并手动填写表单时创建关系,即使其代码看起来大致相同(除了它使用 request.user 的一部分)。注意我修改了原始代码中的一些名称。非常感谢任何帮助!

【问题讨论】:

  • 你能分享你的型号代码吗?
  • @daniel 添加到主帖

标签: python django database


【解决方案1】:

您在迁移中使用函数setup_test。在迁移中,直接导入模型自然不会起作用,因为当前模型状态可能与特定迁移所期望的不同(请参阅文档中有关 Historical models 的注释)。您已经使用get_user_model 函数来获取用户模型并在您的函数中使用它,这将只是使用一些函数来导入您设置的用户模型,因此您会收到错误。

因此,要解决此问题,您需要使用 apps.get_model 来获取用户模型:

def setup_test(apps, schema_editor):
    User = apps.get_model('auth', 'User')
    # In case of a custom user model replace above line like below comment
    # User = apps.get_model('some_app', 'CustomUserModel')
    User.objects.create_superuser("admin", "admin@gm.org", "123")
    x = User.objects.create_user(
        username="x", email="a@gm.org", password="123"
    )
    y = User.objects.create_user(
        username="y", email="b@gm.org", password="123"
    )
    UserRelatinoship = apps.get_model("myapp", "UserRelatinoship")
    UserRelatinoship.objects.create(x=x, y=y, active=True)

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 2020-05-28
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2018-06-03
    相关资源
    最近更新 更多