gpt4 book ai didi

python - 内省(introspection) Django 模型上的属性类型,不会抛出 AttributeError 'objects'

转载 作者:太空宇宙 更新时间:2023-11-03 17:54:19 39 4
gpt4 key购买 nike

这听起来像是重复的,但我绝对找不到与我的问题重复的人。

我的模型:

class SuperCoolModel(models.Model):
large = models.ImageField()
small = models.ImageField()
blah = some.OtherClass() # Not a Field type, but is a subclass of ImageFile

想要做的是(以某种方式)“迭代”此模型实例上的属性,并对作为 ImageField 实例的属性执行某些操作。

例如,这是有效的代码:

from django.db.models.fields.files import ImageFile
a = SuperCoolModel.objects.get(pk=1)
for attrname in dir(a):
# Ignore attr names that we obviously don't care about:
# E.g., anything that starts with an underscore-or-two:
if attrname.startswith('_'):
continue
try:
if isinstance(getattr(a, attrname), ImageFile):
field = getattr(a, attrname)
# Manipulate some stuff, based on the file,
# e.g., using `field.path`.
pass
except AttributeError as e:
# Hopefully this is JUST the 'objects' reference?
pass

在上面的示例中,当它遍历方法/属性名称时,当它到达“对象”时,它引发:

  File "<console>", line 3, in <module>   File "/path/to/lib/python2.7/site-packages/django/db/models/manager.py", line 206, in __get__
raise AttributeError("Manager isn't accessible via %s instances" % type.__name__)
AttributeError: Manager isn't accessible via SuperCoolModel instances

...所以我开始监视 AttributeError 异常。或者,我可以在循环中对“对象”进行硬编码,就像检查下划线名称时所做的那样。

我不能使用a._meta.fieldsa._meta.get_all_field_names()等,因为我也在尝试检查某些任意属性的类型,这些属性不是字段,但属于某个子类和/或类型。

我这样做对吗?还是有更好的方法来跳过这里的“对象”(和其他潜在的“陷阱”)?

最佳答案

我不明白您对为什么不能使用 _meta 方法的解释:您可以使用 a._meta.get_all_field_names() 获取以下列表实际字段,然后将您拥有的任意属性添加到结果列表中。

在即将发布的 1.8 版本中,此功能已被弃用,您需要使用 [f.name for f in a._meta.get_fields()]

请注意,没有属性将是 ImageField 的实例。该实例没有 ImageFields(或 CharFields,或任何字段)作为属性;它有实际的字符串、整数等,在图像的情况下它使用 FieldFile .

关于python - 内省(introspection) Django 模型上的属性类型,不会抛出 AttributeError 'objects',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28708053/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com