Django REST:在POST / PUT中允许外键为get_or_created()

时间:2015-05-28 23:47:01

标签: django-rest-framework

我的情况是我需要能够POST到资源并自动具有特定的外键关系" get_or_create()ed"。

为了简单起见,我将在这里作一个例子:

我们假设我想发布一个新地址,而城市是外键 - 而且有数百万个城市。城市资源可能具有其他属性,例如人口,国家等,但是对于此示例,假设它们默认为NULL,那就是“确定”。

address: { street: "...", city: "..." }

city: { name: "...", population: 10000, ... }

我有几个问题:

  • 当我使用django rest HTML界面时,它会尝试将所有城市添加到HTML选项框中,该选项框会挂起浏览器,因为选项太多了。我不想要一个下拉选项框。我需要一个文本框。
  • 当我提交城市时,我希望创建/更新代码根据名称查找城市并设置关系,或者我希望它创建一个新城市。本质上是城市名称字段中的get_or_create()。我不希望用户在添加地址之前必须POST为每个新城市创建一个新城市。

所以我需要以某种方式告诉DRF,城市是一种我希望像SlugRelatedField一样显示为文本的关系,但我不希望它作为可选择的枚举。我也不想将其设置为read_only(这将解决下拉框问题。)

我需要注意什么才能将它们粘合在一起?我想我需要制作某种自定义字段。

1 个答案:

答案 0 :(得分:0)

我想我可能找到了正确的方法:从serializers.CharField导出并覆盖to_internal_value()get_or_create()

class CityField(serializers.CharField):

   def to_internal_value(self, data):
       value = super(CityField, self).to_internal_value(data)
       return City.objects.get_or_create(name=value)[0]