gpt4 book ai didi

Django Rest Framework 更新嵌套序列化程序

转载 作者:行者123 更新时间:2023-12-02 01:32:02 25 4
gpt4 key购买 nike

我对 DRF 嵌套序列化程序有很大的误解。我阅读了有关此的文档,发现我需要提供自己的更新方法。所以,这里是:

class SkillsSerializer(serializers.ModelSerializer):

class Meta:
model = Skills

class ProfileSerializer(serializers.ModelSerializer):
skills = SkillsSerializer(many=True)

class Meta:
model = Profile
fields = ('user', 'f_name', 'l_name', 'bd_day', 'bd_month', 'bd_year', 'spec', 'company', 'rate', 'skills', 'bill_rate', 'website', 'about', 'city', 'avatar', 'filled')

def update(self, instance, validated_data):
instance.user_id = validated_data.get('user', instance.user_id)
instance.f_name = validated_data.get('f_name', instance.f_name)
instance.l_name = validated_data.get('l_name', instance.l_name)
instance.bd_day = validated_data.get('bd_day', instance.bd_day)
instance.bd_month = validated_data.get('bd_month', instance.bd_month)
instance.bd_year = validated_data.get('bd_year', instance.bd_year)
instance.spec = validated_data.get('spec', instance.spec)
instance.company = validated_data.get('company', instance.company)
instance.rate = validated_data.get('rate', instance.rate)
instance.website = validated_data.get('website', instance.website)
instance.avatar = validated_data.get('avatar', instance.avatar)
instance.about = validated_data.get('about', instance.about)
instance.city = validated_data.get('city', instance.city)
instance.filled = validated_data.get('filled', instance.filled)
instance.skills = validated_data.get('skills', instance.skills)
instance.save()
return instance

我将它与文档进行了比较,并没有发现任何区别。但是在这种情况下,当我尝试更新技能时,它不起作用。有一个真正的魔法:当我把这个
instance.skills = validated_data.get('bd_day', instance.skills)

它工作得很好!例如,如果我设置 bd_day = 12,update 方法会保存 ID 为 1 和 2 的技能实例。
因此,序列化程序似乎忽略了 AJAX 数据中的技能,并且仍然认为该技能序列化程序是只读的。
那么,这个逻辑有什么意义,我如何最终更新我的技能?

更新

我的模型:
class Skills(models.Model):
tags = models.CharField(max_length='255', blank=True, null=True)

def __unicode__(self):
return self.tags


class Profile(models.Model):
user = models.OneToOneField(User, primary_key=True)
...
skills = models.ManyToManyField(Skills, related_name='skills')
...

更新2

对于这种情况仍然没有任何解决方案!我试过 thisthis ——同样的结果。
似乎序列化程序根本忽略了 JSON 数据。

最佳答案

我不得不更新答案,你这样做效率低下,所以看看解决方案,它要好得多

class ProfileSerializer(serializers.ModelSerializer):

class Meta:
model = Profile
fields = ('user', 'f_name', ... 'skills', ... 'filled')
depth = 1

class ProfileUpdateSerializer(serializers.ModelSerializer):
skills = serializers.PrimaryKeyRelatedField(many=True, queryset=Skills.objects.all(), required=False)

class Meta:
model = Profile
fields = ('user', 'f_name', ... 'skills', ... 'filled')

def update(self, instance, validated_data):
user = validated_data.pop('user', {})
for attr, value in validated_data.items():
setattr(instance, attr, value)
instance.save()

if user:
User.objects.filter(id=self.context['request'].user.id).update(**user)


return instance
但在那之后我遇到了另一个问题。我只能从一系列技能中获得一个元素。我在这里找到了解决方案:
 $.ajax({
url: myurl,
type: 'PUT',
dataType: 'json',
traditional: true,<-----THIS!
data: data,
就是这样!它就像一个魅力!
我希望,我的解决方案会有用!

关于Django Rest Framework 更新嵌套序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33596696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com