我想有一个单一的端点,接受POST请求,并创建一个“订单”,可以是两种类型之一。用户应该能够提交一个订单(任何类型)作为JSON,并创建一个新的订单。
在后台,创建了两个模型。一个是“基本订单”模型,用于描述一些常见特征;另一个是“A类订单”或“B类订单”,用于描述该订单的特定特征。实际的订单类型及其字段要复杂得多,因此这里仅描述为A和B以及一些字符字段。
但是一般的想法是使用同一个端点创建两个模型,一个是BaseOrder
模型,另一个是由提交的order_type
字段确定的类型的模型。
我认为条件部分(确定顺序)应该不会太难,但是我不确定如何从同一个端点创建两个独立的模型,即使它总是同一类型。
型号:
class BaseOrder(models.Model):
name = models.CharField(max_length=80)
timestamp = models.DateTimeField(null=False)
class OrderType(models.TextChoices):
TYPEA = "A", "Placeholder A"
TYPEB = "B", "Placeholder B"
order_type = models.CharField(
max_length=16,
verbose_name="Order Type",
choices=OrderType.choices,
)
class TypeAOrder(models.Model):
a_field1 = models.CharField(max_length=80)
a_field2 = models.CharField(max_length=80)
a_field3 = models.CharField(max_length=80)
class TypeBOrder(models.Model):
b_field1 = models.CharField(max_length=80)
b_field2 = models.CharField(max_length=80)
对包含类型A订单的/order端点的POST请求可能如下所示:
{
"name": "test order",
"timestamp": "2022-08-01T12:32:10Z",
"ordertype": "A"
"a_field1": "important"
"a_field2": "data"
"a_field3": "something"
},
这样做会创建两个独立的模型,BaseOrder
模型和TypeAOrder
模型。
我发现this library似乎可以在GET请求中组合模型,但似乎不能创建模型。
3条答案
按热度按时间ffx8fchx1#
在视图中使用if/else条件
1.始终创建基础模型
1.检查if/else条件中的ordertype并相应地创建子模型。
此外,在“基础”模型和子模型之间建立一对一关系。
m1m5dgzv2#
假设您正在使用django-rest-framework for REST API,您可以通过类似下面的方式来实现这一点。
1.序列化程序,用于验证类型A和B模型数据。
1.具有自定义逻辑的BaseOrder序列化器
1.定义将使用基顺序序列化程序的视图
CreateAPIView
将处理def create(....)
部分。1.注册API视图
1.添加测试用例
更多参考
kiayqfof3#
还有其他的实现方法,但是,使用
ModelSerializer
和APIView
的一个简单的例子:serializers.py
views.py