【问题标题】:Django rest framework: Foreign key instance is not being passed to validated_dataDjango rest 框架:外键实例未传递给 valid_data
【发布时间】: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


【解决方案1】:

你的存档有误。

serializer.save(fk=foreign_key_instance) => serializer.save(pk=foreign_key_instance)

【讨论】:

  • 您好,这是我编写的示例的一部分,目的是展示我的意思,而不是实际代码。
  • 是的,但您应该使用 pk 而不是 fk。模型没有 fk.
猜你喜欢
  • 1970-01-01
  • 2017-03-27
  • 2021-12-09
  • 2016-08-06
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多