【问题标题】:Django REST Framework and related models with one fieldDjango REST Framework 和一个字段的相关模型
【发布时间】:2015-12-10 17:07:49
【问题描述】:

我想为以下模型创建一个简单的 REST API:

我有一个名为 Product 的主要实体,其中包含一些字段:名称、价格... 此外,我还有一个名为 Keyword 的相关实体,其中包含一个字段:关键字。

每个产品可以有一个或多个关键字。

我可以很容易地把它翻译成两个 django 模型:

class Product(models.Model):
    name = models.CharField("Name of the product", max_length=100)
    description = models.TextField("Description of the product")
    price = models.IntegerField("Price of the product")
    received_at = models.DateField("Received at")

class Keyword(models.Model):
    keyword = models.CharField(max_length=50)
    product = models.ForeignKey(Product, related_name="keywords")

但是我迷失了序列化程序。

我想要一个像这样的简单动词来创建:

POST /products
{
  "name": "My product name",
  "description": "My product description",
  "price": 40,
  "received_at": "2015-12-1",
  "keywords": ["keyword1", "keyword2"]
}

还有常见的list all,list one,更新和删除:

GET /products
[{"name": "Product 1"...}, {"name": "Product 2"...}]

GET /products/1
{"name": "Product 1", "description": ...}

PUT /products/1
{
  "name": "My product name",
  "description": "My product description",
  "price": 40,
  "received_at": "2015-12-1",
  "keywords": ["keyword2"]
}

DELETE /products/1

问题是管理关键字。 创建新产品时会创建所有关键字 当产品更新时,我必须检查哪些关键词是新闻,哪些关键词已被删除。

我还希望我的 API 在不久的将来可以扩展,具有更多的关系,例如带有简单字符串字段的“关键字关系”。

有什么想法吗?

【问题讨论】:

  • 由于您想将关键字与产品一起发布,因此您必须手动编写逻辑。 DRF 目前不支持嵌套关系 AFAIK 的 POST 请求。

标签: django django-rest-framework


【解决方案1】:

尝试将底层关键字实现为set 的成员。然后,您可以简单地使用每个新关键字调用 add 方法,并且集合将根据集合的工作方式将其保持为唯一的分组。

a = set()
a.add('keyword1')
a.add('keyword2')
a.add('keyword1')
print(a)

输出:

set(['keyword1', 'keyword2'])

【讨论】:

  • 是的,一套是不错的选择。但是,更新请求可以包含比存储的关键字更少的关键字。我可以执行 set(validated_data.get('keywords')) - set(instance.keywords) 来获取新的关键字和 set(instance.keywords) - set(validated_data.get('keywords')) 来获取删除的关键字.有更清洁的解决方案吗?
猜你喜欢
  • 2013-01-12
  • 2021-12-31
  • 2018-11-11
  • 2021-06-22
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-05
  • 2015-01-17
相关资源
最近更新 更多