代码之家  ›  专栏  ›  技术社区  ›  Scott Skiles

ValueError:无法分配对象用户必须是“用户”实例

  •  1
  • Scott Skiles  · 技术社区  · 6 年前

    这对我来说很奇怪。我在Django信号接收器内部设置断点 create_customer_settings 调试这个。应用程序正在抛出 ValueError 即使新的 CustomerSettings 对象已成功创建。当我第二次尝试创建它时,我得到一个唯一的约束错误,但那是因为它已经成功添加。

    值错误 什么时候 isinstance(this_user, User) == True

    这是一个错误,我可以安全地捕捉和忽略?是不是因为 客户设置 User 身份证件?

    创建\客户\设置

    @receiver(post_save, sender=User)
    def create_customer_settings(sender, instance, created, **kwargs):
        if created:
          this_user = User.objects.get(id=instance.id)
          pdb.set_trace()
          CustomerSettings.objects.create(
              user=this_user, 
              email=this_user.email, 
              date_of_birth="1998-01-04", 
              in_private_mode=False
        )                                 
    

    pdb.set\u trace()输出1:

    System check identified no issues (0 silenced).
    October 29, 2018 - 23:42:57
    Django version 2.1.1, using settings 'myapp.settings'
    Starting development server at http://127.0.0.1:7000/
    Quit the server with CONTROL-C.
    > /src/myapp/myapp/models.py(36)create_customer_settings()
    -> pdb.set_trace()
    (Pdb) this_user
    <User: new_user_8080>
    (Pdb) isinstance(this_user, User)
    True
    (Pdb) CustomerSettings.objects.create(
        user=this_user, 
        email=this_user.email, 
        date_of_birth="1998-01-04", 
        in_private_mode=False
    )                                 
    *** ValueError: Cannot assign 
    "<CustomerSettings: CustomerSettings object (6)>": 
    "CustomerSettings.user" must be a "User" instance.
    

    pdb.set\u trace()输出2:

    (Pdb) this_user.is_anonymous
    False
    (Pdb) this_user
    <User: new_user_8080>
    (Pdb) CustomerSettings.objects.create(
        user=this_user, 
        email=this_user.email, 
        date_of_birth="1998-01-04", 
        in_private_mode=False
    )                                 
    *** django.db.utils.IntegrityError: 
    UNIQUE constraint failed: myapp_customersettings.user_id
    (Pdb) CustomerSettings.objects.all()
    <QuerySet [<CustomerSettings: CustomerSettings object (1)>,
    <CustomerSettings: CustomerSettings object (2)>,
    <CustomerSettings: CustomerSettings object (3)>,
    <CustomerSettings: CustomerSettings object (4)>,
    <CustomerSettings: CustomerSettings object (5)>,
    <CustomerSettings: CustomerSettings object (6)>]>
    (Pdb) CustomerSettings.objects.all().values()
    <QuerySet [
    {'id': 1, 'user_id': 1, 'timezone': 'America/New_York', 'email':...
        ...
        ...
        ... 
    , {'id': 6, 'user_id': 15, 'timezone': '', 'email': 'new_user_8080@gmail.com', 
    'email_confirmed': False, 'date_of_birth': datetime.date(1998, 1, 4), 'first_name': '', 'last_name': '', 'in_private_mode': False}]>
    (Pdb) CustomerSettings.objects.filter(user_id=15)
    <QuerySet [<CustomerSettings: CustomerSettings object (6)>]>
    (Pdb) CustomerSettings.objects.filter(user_id=15).values()
    <QuerySet [{'id': 6, 'user_id': 15, 'timezone': '', 'email': 'new_user_8080@gmail.com', 'email_confirmed': False, 'date_of_birth': datetime.date(1998, 1, 4), 'first_name': '', 'last_name': '', 'in_private_mode': False}]>
    (Pdb) CustomerSettings.objects.filter(user_id=15).values()[0]
    {'id': 6, 'user_id': 15, 'timezone': '', 'email': 'new_user_8080@gmail.com', 'email_confirmed': False, 'date_of_birth': datetime.date(1998, 1, 4), 'first_name': '', 'last_name': '', 'in_private_mode': False}
    (Pdb) CustomerSettings.objects.filter(user_id=15).values()[0]['id']
    6
    (Pdb) User.objects.get(id=15)
    <User: new_user_8080>
    (Pdb) 
    

    型号:

    class CustomerSettings(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True, null=False, blank=False)
        timezone = models.CharField(max_length=50, choices=TIMEZONE_CHOICES, blank=False, null=False)
        email = models.EmailField(
                verbose_name='email address',
                max_length=255, blank=False, null=False,
                unique=True)
        email_confirmed = models.BooleanField(default=False)
        date_of_birth = models.DateField()
        first_name = models.CharField(max_length=50, null=False, blank=False)
        last_name = models.CharField(max_length=50, null=False, blank=False)
        in_private_mode = models.BooleanField()
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   schillingt    6 年前

    再次检查您发布的代码是否是您正在运行的代码。错误消息 ValueError: Cannot assign "<CustomerSettings: CustomerSettings object (6)>": "CustomerSettings.user" must be a "User" instance 意味着你正试图创建一个 CustomerSettings 实例,其中 user 属性具有的实例 身份证号码是6。

    create_customer_settings instance 作为实例的论点 客户设置 .

        2
  •  0
  •   Scott Skiles    6 年前

    update_customer_settings ,在成功创建 CustomerSettings 之后的模型 post_save User 在这种情况下 客户设置

    我为我的困惑道歉。你们都给我指出了正确的方向,谢谢。我需要用一种完全不同的方式来处理这件事。

    File "/Users/my_folder/my_app/my_app/models.py", line 44, in update_customer_settings
    CustomerSettings.objects.create(user=instance)
    ValueError: Cannot assign "<CustomerSettings: CustomerSettings object (14)>": "CustomerSettings.user" must be a "User" instance.
    

    更新客户设置

    @receiver(post_save, sender=CustomerSettings)
    def update_customer_settings(sender, instance, created, **kwargs):
        if created:
            CustomerSettings.objects.create(user=instance)
        instance.customersettings.save()