django ManyToManyField序列化器

时间:2018-05-13 13:21:53

标签: django django-rest-framework django-serializer

我是django的新手。我使用的版本是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 :(得分:0)

在您的DesignsSerializer中,您使用名称patterns引用了模式,而未在模型中对其进行定义。

来自Django REST框架documentation

  

您通常希望确保自己设置合适的内容   关于关系的related_name论证,你可以用作   字段名称。

Pattern模型中:

class Pattern(models.Model):
    design_id = models.ManyToManyField(Design, related_name='patterns')
    ...