我想使用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()
不再被这样称呼。这是个好方法吗?如果没有,我应该如何实现呢?我在文档中找不到关于此的任何内容。
答案 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()
)
注意:对于SlugRelatedField
,read_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
)