Как получить все объекты, связанные с данным внешним полем кета, используя сериализаторы rest_framework? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть две модели, и я хочу вызвать значения полей, связанные с внешним ключом, присутствующим в обеих моделях.Например: скажем, у нас есть две модели:

    from django.db import models
    from django.contrib.auth.models import User

    class Bike(models.Model):
        bike_model = models.CharField(max_length=200)
        owner = models.ForeignKey(User,on_delete=models.CASCADE)

    class Car(models.Model):
        car_model = models.CharField(max_length=200)
        owner = models.ForeignKey(User,on_delete=models.CASCADE)

И соответствующий класс сериализатора:

    from rest_framework import serializers
    from .models import Bike,Car

    class BikeSerializer(serializers.ModelSerializer):
        class Meta:
            model = Bike
            fields = ('bike_model','owner')

    class CarSerializer(serializers.ModelSerializer):
        class Meta:
            model = Car
            fields = ('car_model','owner')

Теперь я хочу добавить поле в BikeSerializer, чтобы получить все связанные автомобилис данным владельцем.То есть я хочу внести следующее изменение:

    class BikeSerializer(serializers.ModelSerializer):
        cars_owned = ???
        class Meta:
            model = Bike
            fields = ('bike_model','owner','cars_owned')

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

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вы можете добавить seializer в поле:

class BikeSerializer(serializers.ModelSerializer):
        cars_owned = CarSerializer(source='owner.car_set', many=True, read_only=True)
        class Meta:
            model = Bike
            fields = ('bike_model','owner','cars_owned')
0 голосов
/ 08 февраля 2019

Вы должны посмотреть это SerializerMethodField .По сути, вам нужно создать метод внутри BikeSerializer, который возвращает принадлежащие автомобили.

class BikeSerializer(serializers.ModelSerializer):
        cars_owned = serializers.SerializerMethodField()

        class Meta:
            model = Bike
            fields = ('bike_model','owner','cars_owned')

        def get_cars_owned(self, object):
            # This is your query to get all cars associated
            return object.cars_owned.all() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...