序列化对象时未显示DRF外键字段

时间:2020-10-04 21:31:11

标签: python django django-rest-framework

我有一些模型可以代表用户。用户具有花园,配置文件和gardener_profile。序列化用户对象时,会显示garden和profile,但不会显示gardener_profile。它们都是一对一的关系。在我的招摇的文档中,gardener_profile被识别,但在响应对象中未被识别。

以下是序列化器:

class WorkingHoursSerializer(serializers.ModelSerializer):
    gardener_profile = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = WorkingHours
        fields = '__all__'


class GardenSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=False, queryset=GardreamUser.objects.all())

    class Meta:
        model = Garden
        fields = ['id', 'url', 'grass', 'beds', 'terrace', 'tracks', 'entry', 'user']


class GardenerProfileSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=False, queryset=GardreamUser.objects.all())
    working_hours = WorkingHoursSerializer(many=True)

    class Meta:
        model = GardenerProfile
        fields = ['id', 'url', 'working_radius', 'salary', 'iban', 'contract', 'user', 'working_hours']

    def create(self, validated_data):
        working_hours_data = validated_data.pop('working_hours')
        gardener_profile = GardenerProfile.objects.create(**validated_data)
        for working_hour_data in working_hours_data:
            WorkingHours.objects.create(gardener_profile=gardener_profile, **working_hour_data)
        return gardener_profile


class UserProfileSerializer(serializers.ModelSerializer):
    user = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = UserProfile
        fields = '__all__'


class UserSerializer(serializers.HyperlinkedModelSerializer):
    profile = UserProfileSerializer(required=True)
    garden = GardenSerializer(read_only=True)
    gardener_profile = GardenerProfileSerializer(read_only=True)

    class Meta:
        model = CustomUser
        fields = ['id', 'url', 'username', 'email', 'first_name', 'last_name', 'password', 'groups', 'profile',
                  'garden', 'gardener_profile']
        extra_kwargs = {'password': {'write_only': True}}

这是模型:

class CustomUser(AbstractUser):
    email = models.EmailField(unique=True)


class UserProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profile')
    address = models.CharField(max_length=255)
    country = models.CharField(max_length=50)
    city = models.CharField(max_length=50)
    zip = models.CharField(max_length=5)


class Garden(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    grass = models.DecimalField(max_digits=6, decimal_places=2)
    terrace = models.DecimalField(max_digits=6, decimal_places=2)


class GardenerProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    salary = models.DecimalField(max_digits=6, decimal_places=2)
    contract = models.FileField(null=True, blank=True)


class WorkingHours(models.Model):
    gardener_profile = models.ForeignKey(GardenerProfile, related_name='working_hours', on_delete=models.CASCADE)
    weekday = models.IntegerField(choices=WEEKDAYS)
    from_hour = models.TimeField()
    to_hour = models.TimeField()

    class Meta:
        ordering = ('weekday', 'from_hour')
        unique_together = ('weekday', 'gardener_profile')

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:将related_name='gardener_profile'添加到GardenerProfile的用户字段中