首页 > 解决方案 > 尝试根据登录用户的用户名创建模型对象时出现 ValueError

问题描述

目标

我正在尝试创建一个将字段设置为登录的用户名的Alarm对象。userUser

这个问题与我最近提出的另一个问题相同。但是,我重组了models.pyuser=self.request.user.username现在返回了下面所述的错误。

尽管我现在使用的是 Django 的默认 User 模型,但self.request.user.username无法正常工作的原因是因为我没有设置AUTH_USER_MODEL吗?

错误

ValueError: Cannot assign "'sam_jones'": "Alarm.user" must be a "User" instance.

代码

模型.py

class Alarm(models.Model):
    """ Model representing each Alarm """
    alarm_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    timezone = models.CharField(max_length=30)
    city = models.CharField(max_length=30)
    country = models.CharField(max_length=30)
    time = models.DateTimeField()
    temp_conditional = models.BooleanField()
    surf_conditional = models.BooleanField()
    temp_max = models.FloatField(blank=True, null=True)
    temp_min = models.FloatField(blank=True, null=True)
    surf_max = models.FloatField(blank=True, null=True)
    surf_min = models.FloatField(blank=True, null=True)

    def __str__(self):
        return str(self.alarm_id)

视图.py

class AlarmCreateView(LoginRequiredMixin, CreateView):
    """ CreateView for User to create the Alarm object """
    model = Alarm
    ...

    def form_valid(self, form):
        self.get_user_location(request, form)
        return super().form_valid(form)

    def get_user_location(self, request, form):
        """ Function to get Profile's location from IP and create Alarm object """
        ...
        alarm_object = Alarm.objects.create(
            alarm_id=uuid.uuid4(),
            user=self.request.user.username,
            ...
        )
        alarm_object.save()

标签: pythondjangodjango-modelsdjango-views

解决方案


您必须提供User实例,该实例在request.user属性上可用。所以试试这个

alarm_object = Alarm.objects.create(
            alarm_id=uuid.uuid4(),
            user=self.request.user,
            ...
        )


你也可以通过引用他们来做到这一点id

alarm_object = Alarm.objects.create(
            alarm_id=uuid.uuid4(),
            user=self.request.user.id,
            ...
        )


UNIQUE constraint failed引发异常是因为您将user字段定义OneToOneFieldUser模型,这意味着对于每个Alarm实例都与ATMOST 一个 User相关。


推荐阅读