Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查Django中是否存在模型字段_Python_Django - Fatal编程技术网

Python 检查Django中是否存在模型字段

Python 检查Django中是否存在模型字段,python,django,Python,Django,这就是我在models.py中提出的解决方案: from django.db import models @classmethod def model_field_exists(cls, field): try: cls._meta.get_field(field) return True except models.FieldDoesNotExist: return False models.Model.field_exist

这就是我在models.py中提出的解决方案:

from django.db import models

@classmethod
def model_field_exists(cls, field):
    try:
        cls._meta.get_field(field)
        return True
    except models.FieldDoesNotExist:
        return False

models.Model.field_exists = model_field_exists
然后像这样使用它:

Post.field_exists('title') # > True or False
问题来自外键,我的帖子模型属于一个类别,此检查有效:

Post.field_exists('category') # > True
但这一条没有:

Post.field_exists('category_id') # > False

这是db中的实际字段名,我需要像这样检查它。在django我怎么做?

你为什么需要这个?对象关系映射器的思想是让类来描述/定义数据库。因此,如果要测试模型的类型,应使用
isinstance
如下所示:

if isinstance(model, Post):
    # model is a Post, Post has a publish()
    model.publish()
elif isinstance(model, Comment):
    # model is a Comment, Comment has a foo()
    model.foo()
模型定义定义了模式。不应该有理由必须测试字段的存在。如果有,您可能没有遵循最佳实践,将字段分配给
setattr

hasattr(cls,field)不会在所有情况下都起作用,例如在使用mixin的情况下。安全测试是:

            try:
                model._meta.get_field(field)
                .. do stuff here
            except FieldDoesNotExist:
                pass


如果字段不存在,可以使用getattr返回默认值。。如下

getattr(table, field, False)

您的“category_id”字段在的术语中是一个隐藏字段。get_字段无法检索它

也许在所有字段上循环并检查它们的名称;get_字段可以返回隐藏字段:

for field in cls._meta.get_fields(include_hidden=True):
    if field.name == field:
        return True
return False
如果您需要关心更改了默认值的db_列的字段,您也可以测试field.db_列(但如果未显式设置,则该列是未设置的)

但这一条没有:

Post.field_exists('category_id') # > False
Post.field_存在('category_id')#>False

这是db中的实际字段名,我需要像这样检查它。在django我怎么做

除了
\u id
部分之外的所有情况都在中得到了充分的回答。对于处理_id案例,除了这个答案之外,您基本上还需要一个特殊的条件来恰当地处理这些案例。类似这样的东西:

if field_name.endswith('_id'):
    try:
        field = model._meta.get_field(field_name.strip('_id'))
    except FieldDoesNotExist:
        return False
    if not f.is_relation:
        return False
    return True

需要进行额外的检查,以确保字段减去
\u id
返回一个ForeignKey,而其他类型的字段恰好具有相同的名称,这意味着模型上的
name\u id
字段无效。

在这种情况下,您应该检查类别模型本身吗?您的意思是什么?我需要检查“category\u id”是否是模型“Post”的有效字段名。如果
category
是外键,并且
id
属于
category
,那么
Post
没有该字段,那么你为什么不调用
category.field\u exists('id')
嘿@C.B.,我想你误解了。让我解释一下我的情况:我有一本来自Web服务的扁平词典。这个dict包含模型、Post和Category字段的数据,我需要以编程方式分离属于每个模型的字段。在这种情况下,“category_id”字段属于“Post”模型。您应该将答案标记为正确。这并不能解决他在get_字段中找不到category_id的问题。我同意,如果您只使用Django提供的现成功能,您应该避免手动设置或访问建议方式以外的内容。然而,需要编写更通用的逻辑,比如基类或mixin,以保持代码的干燥,而if-else块中的硬编码模型最终将导致大量的复制粘贴。在这种情况下,动态检查模型中是否存在字段对我来说似乎更合理。不过,这取决于您想要实现什么。通过这种方式,您还可以检查属性和方法