繁体   English   中英

Django:根据类型获取模型对象字段列表?

[英]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”。

详细的:

  1. 要处理字段,您可能需要访问字段值,在所有情况下,您都可以通过循环内的getattr(model_object,field.name)来执行此操作。
  2. 要区分反向关系和外键,您可以使用auto_created属性。 由于ReverseRelationsauto_created属性上返回TrueForeignKey字段则不返回。
  3. ImageField只是一个文件字段,但是它有width,height,url等属性,所以可以通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM