【问题标题】:Django Rest Framework: Error - "user with this uuid already exists."Django Rest Framework:错误 - “具有此 uuid 的用户已存在。”
【发布时间】:2020-11-29 19:33:32
【问题描述】:

我已经编写了一个模型并将 uuid 作为我的主要 id。当我使用 POST 时,它给了我错误 - “具有此 uuid 的用户已经存在。” 仅当我将用户的模型主键从“id”更改为“uuid”时,此错误才开始显示。 p>

这些是相关模型 -

用户模型:

class User(models.Model):
    uuid = models.CharField(default=uuid.uuid4, max_length=50, primary_key=True)
    first_name    = models.CharField(max_length=20)
    last_name     = models.CharField(max_length=20)
    email_id      = models.EmailField(max_length=100, default="")

约会模式:

class Appointment(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    zorg = models.ForeignKey(Zorg, on_delete=models.CASCADE, null=True)
    branch = models.ForeignKey(Zorg_Branche, on_delete=models.CASCADE, null=True, related_name='branch')
    timestamp = models.DateTimeField(auto_now_add=True, blank=True)
    status      = models.ForeignKey(Appointment_Status, on_delete=models.CASCADE, null=True)
    totaltime   = models.PositiveIntegerField(default=0)
    total_price = models.DecimalField(decimal_places=2, max_digits=10, default=0)

约会细节模型:

class AppointmentDetail(models.Model):
    appointment  = models.ForeignKey(Appointment, on_delete=models.CASCADE,null=True, related_name='appointment')
    service      = models.ForeignKey(Service, on_delete=models.CASCADE,null=True, related_name='service')

相关的序列化器 -

UserAppointmentSerializer:

class UserAppointmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = [
                'uuid',
                'first_name',
                'last_name',
                'email_id',
                'mobile_number',
                'birthdate',
                'photo_url',
                'gender',
              ]

class ZorgBranchAppointmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Zorg_Branche
        exclude = ['id', 'zorg']

class ServiceAppointmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Service
        exclude = ['id', 'category']

class ZorgAppointmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Zorg
        fields = [
                'id',
                 'name',
                 'salon_email_id',
                 'website'
             ]

class AppointmentDetailSerializer(serializers.ModelSerializer):

    service = ServiceAppointmentSerializer()
    class Meta:
        model = AppointmentDetail
        exclude = ['id', 'appointment']

class AppointmentStatusSerilizer(serializers.ModelSerializer):

    class Meta:
        model = Appointment_Status
        fields = ['status']

class AppointmentSerializer(serializers.ModelSerializer):
    appointment = AppointmentDetailSerializer(many=True)
    status = AppointmentStatusSerilizer()
    user = UserAppointmentSerializer()
    zorg = ZorgAppointmentSerializer()
    branch = ZorgBranchAppointmentSerializer()
    class Meta:
        model = Appointment
        fields = ['id', 'status',
            'appointment',
            'user',
            'zorg',
            'branch',
            'timestamp',
            'totaltime',
            'total_price']

def create(self, validated_data):
    user = validated_data.pop('user')
    zorg = validated_data.pop('zorg')
    status = validated_data.pop('status')
    branch = validated_data.pop('branch')

    user_instance = User.objects.get(**user)
    zorg_instance = Zorg.objects.get(**zorg)
    status_instance = Appointment_Status.objects.get(**status)
    branch_instance = Zorg_Branche.objects.get(**branch)

    appointment_services = validated_data.pop('appointment')

    appointment = Appointment.objects.create(user = user_instance, zorg = zorg_instance, status = status_instance, branch = branch_instance, **validated_data)

    for services in appointment_services:
        service = services.pop('service')
        service_instance = Service.objects.get(**service)
        AppointmentDetail.objects.create(appointment=appointment, service=service_instance)

    return appointment

【问题讨论】:

  • 我认为在尝试创建新用户时会发生这种情况。当您尝试在 model 中复制唯一字段时会出现您遇到的错误,在这种情况下是您的 primay-key。首先,如果您必须使用自定义主键,请使用 intauto-increments,这样您就不必担心重复和跟踪使用的值。
  • 我在使用 JSON POST 进行预约时收到此错误。当我使用管理面板创建时,它工作正常,但是当我使用 POST 方法进行预约并传递用户 uuid 时,它就会发生。当我从序列化程序中删除 uuid 字段时,它工作正常。

标签: python django api django-rest-framework


【解决方案1】:

我要检查的第一件事是您是否需要在数据库上运行 makemigrationsmigrate

听起来可能是问题,因为问题是在更改模型后发生的。

如果这不能解决问题,请尝试使用 Django 内置的 UUIDField 而不是 CharField。

https://docs.djangoproject.com/en/3.1/ref/models/fields/#uuidfield

from django.db import models

class User(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    # rest of your code...

我可能还建议使用 Django 的内置身份验证系统来管理用户。

https://docs.djangoproject.com/en/3.1/topics/auth/default/

【讨论】:

  • 我检查了运行迁移命令并且不需要迁移。我不能使用 UUIDField 而不是 CharField,因为我在 url 中传递了这个字段来获取单个用户的详细信息。当我从序列化程序中删除 uuid 字段时,它开始正常工作,但是当我使用 uuid 时,它给了我这个错误。
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 2016-09-09
相关资源
最近更新 更多