0

AIM

I am attempting to create an Alarm object with the user field set as the username for the logged in User.

The issue identical to another question I asked recently. However, I restructured models.py and user=self.request.user.username is now returning the error stated below.

Despite the fact that I am now using Django's default User model, is the reason why self.request.user.username isn't working is because I haven't set up AUTH_USER_MODEL?

ERROR

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

CODE

Models.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)

Views.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()
Darcy
  • 575
  • 2
  • 8
  • 21

1 Answers1

2

You have to provide User instance, which is avalibale on request.user attribute. So try this

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


You could do this also by reffering their id as,
alarm_object = Alarm.objects.create(
            alarm_id=uuid.uuid4(),
            user=self.request.user.id,
            ...
        )


UNIQUE constraint failed exception raised because you defined user field as OneToOneField to User model, which means For every Alarm instance are related to ATMOST one User.

JPG
  • 82,442
  • 19
  • 127
  • 206