django сериализатор ManyToManyField - PullRequest
0 голосов
/ 13 мая 2018

Я новичок в Джанго. Я использую версию 1.11.2

У меня есть такая схема.

Существует множество «дизайнов», и каждый дизайн может иметь любое количество «шаблонов».

моя дизайнерская модель похожа на

from django.db import models
from products.models import Product

class Design(models.Model):
    name = models.CharField(max_length=200)
    product_id = models.ForeignKey(Product, on_delete=models.CASCADE)
    price = models.CharField(max_length=200)
    def __str__(self):
        return self.name

Мой дизайнерский сериализатор похож на

from rest_framework import serializers
from .models import Design
from rest_framework import serializers
from patterns.models import Pattern

class DesignsSerializer(serializers.ModelSerializer):
   patterns = DesignPatternSerializer(read_only=True, many=True)
   class Meta:
      depth     = 1
      model = Design
      fields = ('id','name','patterns')
      read_only_fields = ('id','name','patterns')

Представление для дизайна показано ниже

    from django.shortcuts import render
from .models import Design
from .serializers import DesignsSerializer
from rest_framework import generics, filters

# Create your views here.
class ListDesignsByProducId(generics.ListCreateAPIView):

    serializer_class = DesignsSerializer

    def get_queryset(self):
       return Design.objects.filter(product_id__exact  = self.kwargs.get('product_id'))

Моя модель выкройки, как показано ниже.

from django.db import models
from datetime import date
from designs.models import Design

class Pattern(models.Model):
    design_id = models.ManyToManyField(Design)
    name = models.CharField(max_length=200)
    def __str__(self):
        return self.name

Мой сериализатор шаблонов, как показано ниже

from rest_framework import serializers
from .models import Pattern
class PatternSerializer(serializers.ModelSerializer):
    class Meta:            
        depth   = 1
        model = Pattern
        fields = ('id','design_id','name')
        read_only_fields =('id','design_id','name')

Прямо сейчас API вернет детали дизайна и связанных с ним продуктов. Я также хотел бы получить массив шаблонов, связанных с дизайном.

1 Ответ

0 голосов
/ 13 мая 2018

В вашем DesignsSerializer вы ссылались на шаблоны под именем patterns без определения его в ваших моделях.

Из Django REST Framework Документация :

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

В вашей Pattern модели:

class Pattern(models.Model):
    design_id = models.ManyToManyField(Design, related_name='patterns')
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...