django rest框架:有条件地从同一模型中选择序列化器

时间:2017-03-20 08:35:21

标签: python json django django-rest-framework serializer

我的模特

formula.py

TYPE_CHOICES = [
    ('new',),
    ('existing',),
]

user = models.ForeignKey("users.User")
type = models.CharField(
        max_length=10,
        choices=TYPE_CHOICES,
)
name = models.CharField(u"처방명", max_length=20)
reference = models.CharField(
        max_length=20,
        blank=True,
        null=True,
)
base_formula = models.CharField(
        max_length=40,
        blank=True,
        null=True,
)

formula_line.py

herb_item = models.ForeignKey("herbs")
formula = models.ForeignKey("formulas")
quantity = models.SmallIntegerField()

我想将模型序列化为以下形式。

输出

# Use the type field to separate objects. Differently-typed objects include different fields

{
'new': {
            {
                'user': UserId1,
                'base_formula': string,
                'formula_id': int,
            },
            {
                'user': UserId2,
                'base_formula': string,
                'formula_id': int,
            },
            {
                'user': UserId3,
                'base_formula': string,
                'formula_id': int,
            },
        },

'existing': {
                {
                    'name': string,
                    'reference': string,
                    'formula_id': int,
                },
                {
                    'name': string,
                    'reference': string,
                    'formula_id': int,
                },
                {
                    'name': string,
                    'reference': string,
                    'formula_id': int,
                },
            }
}

我一直在搜索SOF并阅读文档一段时间,但我找不到办法做到这一点。

我有一个最微弱的想法,我可能应该:

  1. 以某种方式覆盖get_serializer_class
  2. 覆盖__init __
  3. 但我真的想不出实现这个的方法。

    请注意,我考虑将模型划分为NewFormula和ExistingFormula,并相应地使用两个不同的序列化器。但这是不可能的,因为我在CartItem模型中有一个引用公式的公式字段,这意味着这种方法可能会引起一些令人头疼的问题,因为相同的字段会根据条件引用两个不同的表。

    感谢阅读。任何想法小伙子?

1 个答案:

答案 0 :(得分:1)

一种选择是使用知道如何序列化模型上所有字段的序列化程序。

我不知道为什么显示现有字段的空base_formula会有害。

但是,如果你真的想根据你正在序列化的实例(现有的或新的)显示不同的字段,应该是doable

这些方面的东西:

class FormulaModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Formula
        fields = [...]

    def __init__(self, *args, **kwargs):
        super(FormulaModelSerializer, self).__init__(*args, **kwargs)

        if self.instance.formula_set:
            # hide the fields you don't want to show for an existing object
            self.fields.pop(user)