序列化
- Example Model
class Contract(BaseModel):
""" 续保合同表 """
contract_type = (
('renewal', '续保'),
('purchase', '采购'),
('lease', '租赁')
)
status_type = (
('flow', '审批中'),
('done', '已完成'),
)
name = models.CharField(max_length=64, verbose_name='合同名称')
type = models.CharField(choices=contract_type, max_length=32, default='renewal', verbose_name='合同类型')
supplier = models.ForeignKey(Supplier, on_delete=models.SET_NULL, null=True, blank=False, verbose_name="供应商")
start_date = models.DateTimeField(null=True, blank=True, verbose_name="合同开始时间")
end_date = models.DateTimeField(null=True, blank=True, verbose_name="合同结束时间")
detail = jsonfield.JSONField(verbose_name="详情JSON")
owner = models.ForeignKey(Users, on_delete=models.SET_NULL, null=True, blank=False, verbose_name="负责人")
status = models.CharField(choices=status_type, max_length=32, default='flow', verbose_name='合同状态')
contract_path = models.CharField(max_length=128, blank=True, null=True, verbose_name="合同访问路径")
class Meta:
verbose_name_plural = '合同表'
def __str__(self):
return "%s-%s" % (self.name, self.type)
显示 ForeignKey, choices, 日期
class ContractSerializer(serializers.ModelSerializer):
"""
合同
"""
# 日期
create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
start_date = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
end_date = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
# ForeignKey
display_owner = serializers.ReadOnlyField(source="owner.name")
display_supplier = serializers.ReadOnlyField(source="supplier.name")
# choices
display_status = serializers.ReadOnlyField(source="get_status_display")
class Meta:
model = Contract
fields = '__all__'
自定义字段
class ContractSerializer(serializers.ModelSerializer):
# 自定义返回时间
operating_time = serializers.SerializerMethodField()
class Meta:
model = Contract
fields = '__all__'
# 自定义详情返回
def get_operating_time(self, obj):
if obj.start_date:
print(obj.start_date)
return [obj.start_date.strftime('%Y-%m-%d %H:%M:%S'), obj.end_date.strftime('%Y-%m-%d %H:%M:%S')]
return None