【发布时间】:2014-01-16 11:09:53
【问题描述】:
假设我有两个 Django 模型,ModelA 和 ModelB。在某些情况下,ModelA 对象的创建应该触发 ModelB 对象的创建。目前,在不使用 Tastypie 的情况下,我有以下控制 A 对象创建的视图:
def new_A_created_view(request):
post_data = json.loads(request.body)
... parse post arguments ...
a = ModelA.objects.create(...)
if conditions_are_met(...):
b = ModelB.objects.create(...)
现在我想转换到 REST Api,并使用 TastyPie 我有以下资源:
class ModelAResource(ModelResource):
class Meta:
queryset = ModelA.objects.all()
authorization = Authorization()
...
def hydrate(self, bundle):
if bundle.request.META['REQUEST_METHOD'] == 'POST':
...compute objects attributes from received post data ...
我知道创建相应 B 对象的以下选项:
-
覆盖 save 或 post_save 方法。重写 save 方法或在 ModelA 中添加一个 post_save 信号,以便对象 B 的创建立即遵循保存 A 的行为。我在这种方法中看到的问题:
- 创建对象 ModelB 的逻辑可能不取决于 A 中存在的属性,而是取决于 POST 请求中包含的参数。
- 我在 views.py 中失去了很好的“控制器”逻辑,取而代之的是模型内部更模糊的逻辑。
在 ModelAResource 中覆盖 Resource.obj_create,以便它根据资源 POST 信息创建一个 ModelA 对象和一个 ModelB 对象(如果需要)。在这种情况下,我也觉得对象的创建在某种程度上被掩盖了。
我缺少任何解决方案吗?最好的方法是什么?
【问题讨论】:
-
你能告诉我们ModelA和ModelB是如何在
models.py中声明的吗?他们俩有关系吗? -
在我的特殊情况下,ModelA 将 ModelB 作为其字段之一。所以在 ModelA 内部会有一个定义为 object_b = models.ForeignKey(ModelB) 的字段。 ModelB 与 ModelA 没有直接关系。