【问题标题】:Expose multiple similar database fields as enumerable collection将多个相似的数据库字段公开为可枚举集合
【发布时间】:2015-12-16 17:38:45
【问题描述】:

我有一个底层数据库表的 Django (1.8) 模型,该表具有多个逻辑上是固定大小数组的列。例如:

from django.db import models

class Widget(models.Model):
    # ...
    description_1 = models.CharField(max_length=255)
    description_2 = models.CharField(max_length=255)
    description_3 = models.CharField(max_length=255)
    # ...

我希望能够像访问模型实例上的集合一样访问这些列,例如:

instance = Widget.objects.get(...)
for description in instance.descriptions:
  # do something with each description

我的主要动机是我通过 Django Rest Framework (DRF) 公开此模型,并希望 API 客户端能够轻松枚举与模型关联的 descriptions。就目前而言,客户端必须手动引用每个逻辑“索引”,这使得代码重复。

我的 DRF 序列化程序代码目前是这样的:

class WidgetSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Widget

每个Widget 都有固定数量的descriptions,它们的顺序很重要。

有没有一种干净的方法可以将这些字段作为模型对象上的集合公开?

【问题讨论】:

    标签: python django django-models django-rest-framework


    【解决方案1】:

    这真的很简单,只需在 Model 类中添加一个以序列形式返回字段的方法,然后(对于 API 客户端)手动将该新方法指定为 field 以进行序列化。

    所以模型定义变成:

    from django.db import models
    
    class Widget(models.Model):
        description_1 = models.CharField(max_length=255)
        description_2 = models.CharField(max_length=255)
        description_3 = models.CharField(max_length=255)
    
        def descriptions(self):
            return self.description_1, self.description_2, self.description_3
    

    并且 DRF 序列化器更新如下:

    class WidgetSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = Widget
            fields = ('url', 'descriptions',)
    

    这会导致 API 返回 descriptions 的 JSON 数组并省略所有单独的 description_x 字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      相关资源
      最近更新 更多