Сериализация поля связанной модели в модели DRF - PullRequest
0 голосов
/ 05 марта 2019

У меня есть сериализатор следующим образом:

class ImageSerializer(serializers.HyperlinkedModelSerializer):
    prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
                                             slug_field='pk')

    class Meta:
        model = Image
        fields = (
            'url',
            'photo',
            'prop_post',
        )

Это работает хорошо.Теперь у моего PropertyPost есть поле «владелец», которое мне нужно включить в мой ImageSerializer.Мне было интересно, как я мог это сделать.Я думал, что это может быть похоже на

    fields = (
        'url',
        'photo',
        'prop_post',
        'prop_post__owner'
    )

, но это не сработало.Любая помощь приветствуется.вот моя модель:

class PropertyPost(models.Model):
    owner = models.ForeignKey(
        get_user_model(),
        related_name='posts4thisowner',
        on_delete=models.CASCADE)

class CustomUser(AbstractUser):
    pass


class Image(models.Model):
    prop_post = models.ForeignKey(
        PropertyPost,
        related_name='images4thisproperty',
        on_delete=models.CASCADE)

    photo = models.ImageField(upload_to=upload_update_image, null=True, blank=True)

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Проще использовать 'source', и вы можете использовать свой пользовательский сериализатор для заполнения полей владельца.

Пример:

class ImageSerializer(serializers.HyperlinkedModelSerializer):
    prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
                                             slug_field='pk')

    owner = UserSerializer(source="prop_post.owner")   

    class Meta:
        model = Image
        fields = (
            'url',
            'photo',
            'prop_post',
            'owner',
        )
0 голосов
/ 05 марта 2019

Используйте SerializerMethodField(), чтобы выполнить задачу.Так как вы не опубликовали свои модели и как это связано.Я дал вам нормальное представление о том, как этого добиться.Будет лучше, если вы сможете добавить модели.Я смогу обновить ответ соответственно.

from rest_framework.serializers import SerializerMethodField

class ImageSerializer(serializers.HyperlinkedModelSerializer):
    prop_post = serializers.SlugRelatedField(queryset=PropertyPost.objects.all(),
                                         slug_field='pk')
    prop_post_title = SerializerMethodField()

    class Meta:
        model = Image
        fields = [
            'url',
            'photo',
            'prop_post',
            'prop_post_title',
        ]

    def get_prop_post_title(self, obj):
        try:

            return obj.prop_post.title
        except:
            return None
...