django ManyToManyField 序列化器

django ManyToManyField serializer

我是 django 的新手。我使用的版本是 1.11.2

我有一个这样的模式。

有很多"designs",每个设计可以有任意数量的"patterns"。

我的设计模型如下

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 会 return 设计细节及其相关产品。 我还想获得与设计相关的一系列模式。

在您的 DesignsSerializer 中,您通过名称 patterns 引用了 模式 ,而没有在您的模型中定义它。

来自 Django REST 框架 documentation:

You'll normally want to ensure that you've set an appropriate related_name argument on the relationship, that you can use as the field name.

在您的 Pattern 模型中:

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