2015-12-10 50 views
0

我想创建以下模型简单的REST API:Django的REST框架,并与一个字段相关车型

我叫产品,其中一些字段主要实体:名称,价格...... 我也有一个名为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"] 
} 

和公共列表中的所有,列表中的一个,更新和删除:

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可以在不久的将来用更多的关系来扩展,比如带有简单字符串字段的“关键字关系”。

任何想法?

+0

既然你要发布的产品一起关键字,你必须手动编写的逻辑。 DRF现在不支持嵌套关系POST请求AFAIK。 –

回答

0

尝试执行底层关键字作为set的成员。然后,您可以简单地使用每个新关键字调用add方法,并根据集合的工作性质,该集合将保持它独特的分组。

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

输出:

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

是的,一套是一个不错的选择。但是,更新请求可以包含比存储的关键字更少的关键字。我可以做set(validated_data.get('keywords')) - set(instance.keywords)来获取新的关键字和set(instance.keywords) - set(validated_data.get('keywords'))来获取被删除的关键字。有没有更干净的解决方案来做到这一点? – Garet

相关问题