Я не могу заставить свои модели правильно сериализоваться с помощью Django DRF, но они сериализуются в Admin

Я в полном недоумении! Я не могу понять, почему моя сериализация не работает должным образом.

Две проблемы; первая заключается в том, что я не могу заполнить поля Employee и Business ForeignKey для сериализатора Bookings в представлении DRF API, но могу на стороне администратора. Я дошел до точки, где он показывает что-то относительно ForeignKey, но ошибка списка не принята и нет фактического поля; это не было правильным независимо от этого. Даже когда я пытаюсь просмотреть необработанные данные, внешние ключи не присутствуют в качестве какого-либо типа входных опций.

Эту проблему я заметил, когда пытался переопределить методы perform_create() и create() - перепробовал множество различных вариаций и в итоге понял, что методы даже не вызывались print('create is being executed') пока я явно не сделал поле serialzer read_only.

Я надеюсь, что причина того, что perform_create() и/или create() не сработали, в том, что сериализатор даже не заполняет поле, чтобы я мог вручную ввести данные для ForeignKeys; не говоря уже о другом методе.

Я упростил модели, сериализатор и представление, чтобы включить только необходимые объекты/методы; пожалуйста, дайте мне знать, если мне нужно поделиться чем-то еще.

И как всегда спасибо!

models.py

class Business(models.Model):
    ....
    user = models.OneToOneField('User', on_delete=models.CASCADE, primary_key=True, related_name='user')
    company_name = models.Charfield(max_length=200)

class Employee(models.Model):
    ....
    user = models.OneToOneField('User', on_delete=models.CASCADE, primary_key=True, related_name='user')
    business = models.ForeignKey('Business', on_delete=models.CASCADE)
    name = models.Charfield(max_length=200)

class Bookings(models.Model):
    ....
    person = models.ForeignKey(Person, blank=True, null= True, on_delete = models.SET_NULL, related_name="%(class)s_employee")
    business = models.ForeignKey('Business', on_delete=models.CASCADE)
    bookings_count = models.IntegerField(default=0)

Я опустил произвольные поля, чтобы попытаться упростить его насколько это возможно - я не думаю, что они необходимы, но дайте мне знать, если вам нужно, чтобы я поделился.

serializers.py

class EmployeeSerializer(serializers.ModelSerializer):

    email = serializers.EmailField(write_only=True, required=True, validators=[UniqueValidator(queryset=User.objects.all())])
    user_name = serializers.CharField(write_only=True, required=True, validators=[UniqueValidator(queryset=User.objects.all())] )
    password = serializers.CharField(write_only=True, required=True, validators=[validate_password])
    password2 = serializers.CharField(write_only=True, required=True)

    class Meta:
        model = Employee
        fields = ('email', 'user_name', 'password', 'password2'....)

    def validate(self, attrs):
        if attrs['password'] != attrs['password2']:
            raise serializers.ValidationError({"password": "Password fields didn't match."})

        return attrs

    def create(self, validated_data):
        password = validated_data.pop('password')
        user = User(email=validated_data['email'], user_name=validated_data['user_name'])
        user.set_password(password)
        user.save()

        Employee.objects.create(user_id= user.email, 
                                .......)
        return validated_data

class BusinessSerializer('ditto')

class CustomerBookingsSerializer(serializers.ModelSerializer):

    class Meta:
        model = Bookings
        fields = ('__all__')
        depth = 3

views.py

class EmployeeViewSet(viewsets.ModelViewSet):

    permission_classes= [DjangoModelPermissions]    
    serializer_class = EmployeeSerializer
    def get_queryset(self):
        return Employee.objects.all()

class BusinessViewSet(viewsets.ModelViewSet):

    permission_classes= [DjangoModelPermissions]    
    serializer_class = BusinessSerializer
    def get_queryset(self):
        return Business.objects.all()

class BookingsViewSet(viewsets.ModelViewSet):
    permission_classes= [DjangoModelPermissions]
    serializer_class = BookingsSerializer


    def get_queryset(self):
        queryset = Bookings.objects.all()
        return queryset

p.s Я написал его в свободной форме, поэтому, возможно, есть синтаксические ошибки, а также я собираюсь провести рефакторинг - любые рекомендации будут высоко оценены.

Вернуться на верх