我有一个包含外键的模型,所以我创建了我的更新功能,但是当我想更新我的模型时所有字段的问题都会更新,除了外键。我不知道为什么。我希望我得到答案
我的模特:
class Produit (models.Model):
titre=models.CharField(max_length=100)
description=models.TextField()
photo_principal=models.ImageField(upload_to='produits/',default='image.jpg')
photo_1 = models.ImageField(upload_to='produits/', default='image.jpg')
photo_2 = models.ImageField(upload_to='produits/', default='image.jpg')
photo_3 = models.ImageField(upload_to='produits/', default='image.jpg')
prix=models.FloatField()
new_prix=models.FloatField()
categorie=models.ForeignKey(Categorie,related_name= 'produit', on_delete=models.CASCADE)
serializers.py
class ProduitUpdateSerializer(serializers.ModelSerializer):
categorie_id = serializers.PrimaryKeyRelatedField(queryset=Categorie.objects.all(),source='categorie.id')
class Meta:
model = Produit
fields = ['titre', 'description', 'photo_principal', 'photo_1', 'photo_2', 'photo_3', 'prix', 'new_prix',
'categorie_id', ]
def update(self, instance, validated_data):
print(validated_data)
instance.categorie_id = validated_data.get('categorie_id',instance.categorie_id)
instance.titre = validated_data.get('titre', instance.titre)
instance.description = validated_data.get('description', instance.description)
instance.photo_principal = validated_data.get('photo_principal', instance.photo_principal)
instance.photo_1 = validated_data.get('photo_1', instance.photo_1)
instance.photo_2 = validated_data.get('photo_2', instance.photo_2)
instance.photo_3 = validated_data.get('photo_3', instance.photo_3)
instance.prix = validated_data.get('prix', instance.prix)
instance.new_prix = validated_data.get('new_prix', instance.new_prix)
instance.save()
return instance
答案 0 :(得分:5)
为什么不这样调用super,因为Modelerialiser对m2m db进行了额外的迭代。
def update(self, instance, validated_data):
# MANIPULATE DATA HERE BEFORE INSERTION
instance = super(ProduitUpdateSerializer,self).update(instance, validated_data)
# ADD CODE HERE THAT YOU WANT TO VIEW
return instance
答案 1 :(得分:2)
在这种情况下,您不应该直接使用id,因为序列化程序将返回一个对象:
class ProduitUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = Produit
fields = ['titre', 'description', 'photo_principal', 'photo_1', 'photo_2', 'photo_3', 'prix', 'new_prix',
'categorie', ]
def update(self, instance, validated_data):
print(validated_data)
instance.categorie = validated_data.get('categorie', instance.categorie)
instance.titre = validated_data.get('titre', instance.titre)
instance.description = validated_data.get('description', instance.description)
instance.photo_principal = validated_data.get('photo_principal', instance.photo_principal)
instance.photo_1 = validated_data.get('photo_1', instance.photo_1)
instance.photo_2 = validated_data.get('photo_2', instance.photo_2)
instance.photo_3 = validated_data.get('photo_3', instance.photo_3)
instance.prix = validated_data.get('prix', instance.prix)
instance.new_prix = validated_data.get('new_prix', instance.new_prix)
instance.save()
return instance
答案 2 :(得分:1)
这是更干燥的代码。可能会从列表中排除字段,以避免更新
def update(self, instance, validated_data):
fields=instance._meta.fields
exclude=[]
for field in fields:
field=field.name.split('.')[-1] #to get coulmn name
if field in exclude:
continue
exec("instance.%s = validated_data.get(field, instance.%s)"%(field,field))
instance.save()
return instance