Django Rest Framework:如何添加ManyToMany关系?

时间:2018-07-25 13:30:11

标签: django django-models django-rest-framework many-to-many

我想使用Django Rest Framework添加多对多关系。实现此目标的最佳方法是什么?

在Django shell级别上,我要说的是ModelA.model_bs.add(model_b)。该怎么办?

我已经使用generic.CreateAPIView并覆盖了perform_create()这样的方法来实现了这一点:

def perform_create(self, serializer):
  model_a = self.get_object()
  model_b = ModelB.objects.get(uuid=serializer.validated_data["model_b"]["uuid"])
  model_a.modelbs.add(model_b)

这只是感觉很奇怪,因为serializer.save()不再被这样称呼。这是个好方法吗?如果没有,我应该如何实现呢?我在文档中找不到关于此的任何内容。

2 个答案:

答案 0 :(得分:1)

不确定是否发生了更复杂的事情,因为您没有显示模型,但是对于简单的ManyToMany关系,最简单的解决方案是使用PrimaryKeyRelatedField。像这样:

class ModelASerializer(serializers.ModelSerializer):
    model_b = serializers.PrimaryKeyRelatedField(many=True, read_only=False)

然后,您将通过更新通过API将对象添加到此字段。

更新

如果重要的是使用uuid字段而不是在API上公开主键,我建议使用SlugRelatedField,其目的是“使用以下字段代表关系的目标目标”:

class ModelASerializer(serializers.ModelSerializer):
    model_b = serializers.SlugRelatedField(
        many=True, 
        slug_field='uuid',
        queryset=ModelB.objects.all()
    )

注意:对于SlugRelatedFieldread_only的默认值为False,但是您要做需要指定一个查询集。

答案 1 :(得分:1)

您可以实现以下目标:

  

模型

from django.db.models import Model, ManyToManyField


class Employee(Model):
    company = ManyToManyField(Company)
  

序列化器

from rest_framework.serializers import ModelSerializer, IntegerField, RelatedField


class CompanyRelatedField(RelatedField):
    def to_representation(self, obj):
        data = {
            'id': obj.id,
            'title': obj.title
        }
        return data

    def to_internal_value(self, id):
        return Company.objects.get(id=id)


class EmployeeSerializer(ModelSerializer):
    id = IntegerField(read_only=True)
    company = CompanyRelatedField(
        queryset=Company.objects.all(), many=True, required=True
    )