Я не могу заставить свои модели правильно сериализоваться с помощью 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 Я написал его в свободной форме, поэтому, возможно, есть синтаксические ошибки, а также я собираюсь провести рефакторинг - любые рекомендации будут высоко оценены.