【问题标题】:Django tastypie: how to retrieve a list of child objects and attach that list to the 'choices' field atrributeDjango sweetpie:如何检索子对象列表并将该列表附加到“选择”字段属性
【发布时间】:2023-03-21 18:25:01
【问题描述】:

我有一个名为 Blueprint 的模型类:

class Blueprint(models.Model):
    name = models.CharField(max_length=120)
    description = models.TextField()
    workloads = models.CharField(choices=WORKLOAD_CHOICES)

    class Meta:
        ordering = ["name", ]

此模型具有名为工作负载的子级。

对 django 和 sweetpie 来说都是全新的,我有一个问题:

1) 我在哪里执行逻辑,该逻辑检索工作负载列表,并填充 WORKLOAD_CHOICES:在 models.py(作为 init 的一部分)或 api.py 作为def obj_get 的一部分?

附:这是api.py:

class BlueprintResource(ModelResource):
    def obj_create(self, bundle, request=None, **kwargs):
        return super(BlueprintResource, self).obj_create(bundle, request)

    def obj_update(self, bundle, request=None, **kwargs):

        blueprint = Blueprint.objects.get(id=kwargs.get("pk"))
        blueprint.description = bundle.data.get("description")
        blueprint.name = bundle.data.get("name")
        blueprint.workloads = bundle.data.get("workloads")
        blueprint.save()

        def obj_delete(self, bundle, **kwargs):

            return super(BlueprintResource, self).obj_delete(bundle)

    class Meta:
        queryset = Blueprint.objects.all()
        resource_name = 'blueprint'
        authorization=Authorization()

【问题讨论】:

  • 您希望将WORKLOAD_CHOICES 元组中的值作为资源返回?
  • 我需要将这些 WORKLOAD_RESOURCES 作为“附加”到工作负载属性的值列表返回。我确实有一个名为 Workload 的单独模型类,并且我需要在 Blueprint 和 Workload 模型之间进行多对多。因此,在这种特殊情况下,我需要返回一个蓝图实例,其工作负载字段表示为相关工作负载对象的列表

标签: django django-models tastypie


【解决方案1】:

看看build_bundle()full_dehydrate()。我还没有对此进行测试,但也许这样的东西会起作用。

from my_app.models import WORKLOAD_CHOICES

class BlueprintResource(ModelResource):

    def full_dehydrate(self, bundle, for_list=False):

         dic = dict([WORKLOAD_CHOICES])
         bundle.data['foo'] = self.build_bundle(data=dic)

         return super(BlueprintResource, self).full_dehydrate(bundle, for_list)

【讨论】:

  • 很快就会看到。谢谢你!
  • 实际上,现在,我对此进行了一些思考 - 只包含一个指向相关工作负载对象的 URL 是有意义的,而不是将它们序列化到一个列表中,以便与该对象一起传输单个蓝图对象。这样,在接收端,我只需拨打第二个电话即可获取那些相关的工作负载
  • 您可以使用与上面相同的代码。要么写一个新的资源(你可以在 Meta 中指定另一个资源名称),或者使用prepend_urls(),如果你想让它像蓝图的子资源一样。
  • 这很有用。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 2019-02-08
  • 2011-07-02
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
相关资源
最近更新 更多