【发布时间】:2019-11-11 17:05:21
【问题描述】:
我正在尝试使用 ModelSerializer 将数据保存到我的数据库,但是当我传递一个 ForeignKey 实例时,它在调用 is_valid() 后从实例类型转换为字符串或整数类型,这是我得到的错误:
ValueError at /app/core/create-trip
Cannot assign "'ChIJTWE_0BtawokRVJNGH5RS448'": "CityAttrRtTb.attr_nm" must be a "CityAttrn" instance.
上面的错误表明 CityAttrn 实例在调用 is_valid() 后被转换为其各自的字段值(因此其类型发生了变化)。
我的问题和this question基本一样
我上面链接的问题有一个答案,我需要在调用 is_valid() 方法后才需要将外键作为参数传递给序列化程序的 save() 方法。
if serializer.is_valid():
serializer.save(fk=foreign_key_instance)
在这个例子中,我有一个数据,因为我在调用 is_valid 之后传递了外键,所以似乎没有问题。如果我只有一个数据,我可以做到这一点。但是,我正在尝试使用 .save(many=True) 一次保存多个数据,并且每个数据都有不同的外键实例。如何保存这些类型的数据?
models.py
class CityAttraction(models.Model):
cty_attr_id = models.AutoField(primary_key=True)
cty_nm = models.CharField(max_length=200)
attr_nm = models.CharField(max_length=200, unique=True)
des = models.CharField(max_length=200, blank=True, null=True)
class Meta:
managed = False
db_table = 'city_attrn'
unique_together = (('cty_nm', 'attr_nm'),)
class CityAttractionRating(models.Model):
cty_nm = models.CharField(max_length=200)
attr_nm = models.ForeignKey('CityAttrn', on_delete=models.CASCADE, db_column='attr_nm', primary_key=True, to_field='attr_nm')
rt_src = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'city_attr_rt_tb'
unique_together = (('cty_nm', 'attr_nm', 'rt_src'),)
views.py
def some_calculation(city_attraction):
final_result = []
for cityattraction_instance in city_attraction:
print(attraction)
rating_dict["cty_nm"] = "TEST"
rating_dict["attr_nm"] = cityattraction_instance # its type is CityAttraction instance right now but it gets changed to string after calling is_valid()
rating_dict["rt_src"] = 1
final_result.append(rating_dict.copy())
return final_result
city_attraction = CityAttractionSerializer(data=request.data, many=True) if city_attraction.is_valid():
city_attraction = city_attraction.save()
calculated_data = some_calculations(city_attraction)
integer_rated_attraction = CityAttractionRatingSerializer(data=calculated_data, many=True)
if integer_rated_attraction.is_valid():
integer_rated_attraction.save() #how do I save all the instances of CityAttraction here without changing its type to string or integer from "instance"?
在上面的视图中,city_attraction 是所有 CityAttraction 实例的列表。我需要将它传递给 integer_rated_attraction.save() 的参数,以免因为 is_valid() 而丢失“实例”类型。我该怎么做?
序列化器.py
class CityAttractionSerializer(serializers.ModelSerializer):
class Meta:
model = CityAttraction
fields = '__all__'
class CityAttractionRtSerializer(serializers.ModelSerializer):
class Meta:
model = CityAttractionRating
fields = '__all__'
当我将 CityAttraction 实例传递给 some_calculation 函数,然后执行验证和保存时,我期望模型被保存。但是,因为调用 is_valid() 函数将 CityAttr 更改为字段值(在本例中为“ChIJTWE_0BtawokRVJNGH5RS448”),所以顶部显示了一个值错误异常。我将如何解决这个问题?谢谢!
【问题讨论】:
-
什么叫“外键模型实例”?我不清楚你在做什么,你发送的数据是什么样的,或者你的序列化器是什么样的。
-
您在序列化程序中为关系使用什么类型的字段?
-
嗨。我已经完全重写了这个问题以使其更清楚。给您带来的不便深表歉意!
-
serializer.save(fk=foreign_key_instance) => serializer.save(pk=foreign_key_instance)
标签: django python-3.x django-rest-framework