首页 > 解决方案 > Django RF - 带有 ModelViewSet 的嵌套序列化程序

问题描述

我有嵌套序列化程序的问题。在 Shell 中一切正常,但是当我发出 HTTP 请求时,总是出现“必填字段”之类的错误。

楷模:

class Product(models.Model):
index = models.CharField(max_length=12, unique=True, db_index=True)
quantity = models.PositiveIntegerField(default=0)

def __str__(self):
    return self.index


class Name(models.Model):
    product = models.ForeignKey(Product, related_name='names', on_delete=models.CASCADE, null=True)
    language = models.CharField(max_length=50, default="name_pl")
    title = models.CharField(max_length=300, blank=True, null=True)

    def __str__(self):
        return self.language

序列化器:

class ProductSerializer(serializers.ModelSerializer):
names = NameSerializer(many=True)

class Meta:
    model = Product
    fields = ["index", "quantity", "names"]

def create(self, validated_data):
    names = validated_data.pop('names')
    product = Product.objects.create(**validated_data)
    for name in names:
        Name.objects.create(product=product, **name)
    return product

意见:

class NameView(viewsets.ModelViewSet):
queryset = Name.objects.all()
serializer_class = NameSerializer
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_fields = ('id',)
search_fields = ['id']


class ProductView(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_backends = [DjangoFilterBackend, filters.SearchFilter]
    filterset_fields = ('id',)
    search_fields = ['id']
    permission_classes = (CustomDjangoModelPermissions,)

我正在尝试发布数据:

data = {
    "index": "11111",
    "quantity": 1213,
    "names": [
        {"language": "DE","title": "GER"},
        {"language": "CZ","title": "CZZ"}
    ]
}

回应:

names field required

我试图覆盖视图中的创建,以“查看”有什么问题:

    def create(self, request):
    data = request.data
    serializer = ProductSerializer(data=data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=201)
    return Response(request.data, status=400)

然后我得到:

{'index': '11111', 'quantity': '1213', 'names': 'title'}

所以它不能发送所有数据,所以它不能验证。需要帮助,请;)

标签: djangodjango-rest-framework

解决方案


问题解决了:

只是忘记添加请求:

data = json.dumps(data)


推荐阅读