Raj*_*war 1 many-to-many django-models django-rest-framework
我想使用部分更新来更新模型的多对多字段。但是我收到错误
<django.db.models.fields.related.ManyToManyField: skills> (only non-relations and foreign keys permitted).
Run Code Online (Sandbox Code Playgroud)
这就是我的模型目前的样子
class modelJob(models.Model):
skills = models.ManyToManyField(modelSkill,blank=True)
title = models.CharField(max_length=200, unique=False,blank=False,null=True)
moreInfo = models.CharField(max_length=500, unique=False,blank=False,null=True)
Run Code Online (Sandbox Code Playgroud)
这就是我的序列化器的样子
class Serializer_PartialUpdateJob_RX(serializers.ModelSerializer):
class Meta:
model = modelJob
fields = '__all__'
def update(self, instance, validated_data):
modelJob.objects.filter(pk=instance.id).update(**validated_data)
job = modelJob.objects.get(pk=instance.id)
return job
Run Code Online (Sandbox Code Playgroud)
这就是我的看法
class PartialUpdate_Jobs(GenericAPIView, UpdateModelMixin):
queryset = modelJob.objects.all()
serializer_class = Serializer_PartialUpdateJob_RX
lookup_field = 'id'
def put(self, request, *args, **kwargs):
result = self.partial_update(request, *args, **kwargs)
return Response(Serializer_Job_TX(self.queryset[0]).data)
Run Code Online (Sandbox Code Playgroud)
现在我只想更新多对多字段(技能),这就是我的 json 的样子
{
"skills" :[
2,4
]
}
Run Code Online (Sandbox Code Playgroud)
其中 2 和 4 是技能对象的 ID,此时我收到错误
<django.db.models.fields.related.ManyToManyField: skills> (only non-relations and foreign keys permitted).
Run Code Online (Sandbox Code Playgroud)
有什么建议我可能做错了什么以及如何解决这个问题吗?
您可以在序列化器的更新功能中完成此操作。
首先,您引入“技能”作为序列化器的属性,它是技能 ID 列表。如果您想使用相同的序列化器来列出,但您选择的名称表明它是“部分”序列化器,您可能会称其为其他名称,我假设它仅用于更新。
class Serializer_PartialUpdateJob_RX(serializers.ModelSerializer):
skills = serializers.PrimaryKeyRelatedField(queryset=modelSkill.objects.all(), write_only=True, many=True, required=False)
def update(self, instance, validated_data):
skills = validated_data.pop('skills', None)
instance = super().update(instance, validated_data) # if you want to update other fields
# now update skills
if skills is not None:
for skills in skills:
instance.skills.add(skill)
instance.save()
return instance
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2375 次 |
| 最近记录: |