我的模特
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,
)
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并阅读文档一段时间,但我找不到办法做到这一点。
我有一个最微弱的想法,我可能应该:
但我真的想不出实现这个的方法。
请注意,我考虑将模型划分为NewFormula和ExistingFormula,并相应地使用两个不同的序列化器。但这是不可能的,因为我在CartItem模型中有一个引用公式的公式字段,这意味着这种方法可能会引起一些令人头疼的问题,因为相同的字段会根据条件引用两个不同的表。
感谢阅读。任何想法小伙子?
答案 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)