Включить атрибуты из другой ссылочной модели в отфильтрованный запрос на получение в среде REST django - PullRequest
0 голосов
/ 05 апреля 2019

Моя цель - включить атрибут name модели Brand и ссылки Product через models.ForeignKey, когда я делаю запрос на получение продуктов.Именно то, что этот фрагмент кода возвращает в оболочке Python:

Product.objects.all().values('name', 'brand__name',)

возвращает это:

[
    {'name': 'B-1', 'brand__name': 'B-brand'}, 
    {'name': 'B-2', 'brand__name': 'B-brand'}, 
    {'name': 'C-1', 'brand__name': 'C-brand'}
]

Я уже использую django-filters для фильтрации моих запросов на получение.

Модели:

class Brand(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=255)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE, default=None)

    def __str__(self):
        return self.name

Сериализаторы:

class BrandSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Brand
        fields = ('id', 'url', 'name')


class ProductSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Product
        fields = ('id', 'url', 'name', 'brand')

Фильтр:

class ProductFilter(filters.FilterSet):
    name = filters.CharFilter(lookup_expr = 'icontains')
    brand__name = filters.CharFilter(lookup_expr = 'icontains')

    class Meta: 
        model = Product
        fields = ('name' 'brand__name',)

Просмотр:

class ProductView(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filterset_class = ProductFilter

с brand__name внабор фильтров, я могу ссылаться на название модели бренда, на которую ссылается определенный продукт, и извлекать ее.Моя цель состоит в том, чтобы при создании get request я также включил это же имя бренда вместе с атрибутами товара, который в настоящее время дает только URL / ссылку на бренд (вместе со всеми другими атрибутами Product).

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Если вы хотите вернуться в виде плоского словаря, вы можете сделать это следующим образом.

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    brand_name = serializer.CharField(source="brand__name")
    class Meta:
        model = Product
        fields = ('id', 'url', 'sku', 'name', 'brand_name', 'price')

0 голосов
/ 05 апреля 2019

Я решил свою собственную проблему, определив brand как brandSerializer в ProductSerializer, и я смог вернуть весь объект бренда вместе с информацией о продукте, например, так:

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    brand = BrandSerializer()
    class Meta:
        model = Product
        fields = ('id', 'url', 'sku', 'name', 'brand', 'price')
...