Вложенный сериализатор для внешних ключей
У меня есть две модели - Users и UserAccessLogs:
class Users(AbstractUser):
email = models.EmailField()
name = models.Charfield()
etc.
class UserAccessLogs(AbstractUser):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
anotherField = models.Charfield()
etc.
с сериализаторами:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = Users
fields = '__all__'
def validate_email(self, value):
# validations here
def update(self, instance, validated_data):
instance.email = validated_data['email']
etc.
instance.save()
return instance
class UserAccessLogsSerializer(serializers.ModelSerializer):
class Meta:
model = UserAccessLogs
fields ='__all__'
В моей функции представления я хотел бы получить фактический класс пользователя при получении UserAccessLogs т.е. я хотел бы:
UserAccessLogs = {
user : {
email: myEmail,
name: myName,
etc.
}
}
вместо
UserAccessLogs = {
user : 1
}
в моих взглядах:
access_logs = UserAccessLogs.objects.all()
serializer = UserAccessLogsSerializer(access_logs, many = True)
return Response(serializer.data, status.HTTP_200_OK)
Я попробовал добавить user = UserSerializer()
в класс UserAccessLogsSerializer. Это работает, но затем, когда я пытаюсь сохранить новый экземпляр UserAccessLogs, я получаю ошибки, связанные с моделью User от валидаторов. Если я устанавливаю read_only = True
, то в базе данных остается user = null. Нижеприведенное работает в моем классе представлений, но оно не кажется эффективным и должно повторяться каждый раз, когда я хочу получить полный UserAccessLogs.
for data in serializer.data:
data['user'] = UserSerializer(User.objects.get(id = data['user'])).data
создайте два сериализатора в serializer.py
class User_serializer(serializers.ModelSerializer):
class Meta:
model = Users
fields = '__all__'
class User_access_serializer(serializers.ModelSerializer):
class Meta:
model = UserAccessLogs
fields = '__all__'
user = User_serializer()
в тебе API
:
UserAccessLogs_queryset = UserAccessLogs.objects.all()
serializer_class = User_access_serializer(UserAccessLogs_queryset ,many=True)
return Response(serializer_class.data)
он создаст nested API
так, как вам нужно
Также я предполагаю, что у вас есть ошибка при выполнении класса
UserAccessLogs
. по(AbstractUser)
похоже, что вам нужноclass UserAccessLogs(models.Model):
попробуйте это
user = UserSerializer(read_only=True)
user_id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), source='user')