[英]Django: Get list of model object fields depending on their type?
列出模型及其对象的字段已在此处成功回答。 但我想要一种根据对象字段的类型处理对象字段的通用方法,以便我可以在字典中手动序列化它们。 例如:ManyToMany,OneToMany ...,FileField,...,Relations_field(模型中不存在但在其他模型中定义为外键的字段)。
我不知道手动序列化您的模型对象的合理需求有多大,但我的目的是教学而非性能导向。
这是一个小函数,我将模型对象转换为 JSON 可序列化字典。
def obj_to_dict(obj):
fields = obj._meta.get_fields()
obj_dict = {}
# Here I want to process fields depending upon their type:
for field in fields:
if field is a relation:
## DO SOMETHING
elif Field is ManyToMany or OneToMany ... :
## DO SOMETHING
elif field is image field:
## DO SOMETHING
else:
## DO SOMETHING
return obj_dict
这里的答案确实提供了一种方法,但不是我想要的,而是根据领域进行更多概括的方法。
简短回答: get_internal_type()
方法正是这里所需要的。 它返回一个字段类型的字符串,例如:“FileField”。
警告:模型中未本地定义的反向关系和定义为某个其他模型的外键的字段,都通过此方法返回为“ForeignKey”。
详细的:
getattr(model_object,field.name)
来执行此操作。auto_created
属性。 由于ReverseRelations
在auto_created
属性上返回True
而ForeignKey
字段则不返回。getattr(obj,field.name).width
属性来查看。您可以按如下方式遍历字段:
def obj_to_dict(obj):
fields = obj._meta.get_fields()
obj_dict = {}
# Here I want to process fields depending upon their type:
for field in fields:
field_val = getattr(obj,field.name)
if field.get_internal_type()=="ForeignKey" and not field.auto_created:
## for foreign key defined in model class
elif field.get_internal_type()=="ForeignKey" and field.auto_created:
## for reverse relations not actually defined in model class.
elif field.get_internal_type()=="ManyToMany"/ "OneToMany" ... :
DO SOMETHING
# for image field
elif field.get_internal_type() == "FileField" and field_val.width:
## DO SOMETHING
else:(for other locally defined fields not requiring special treatment)
## DO SOMETHING
return obj_dict
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.