如果在only()方法中未提供字段名,如何防止能够访问QuerySet对象的字段?

假装我有这个Django模型:

class Person(models.Model)
    name = models.CharField()
    age = models.IntegerField()

然后我在模型上执行以下查询:

queryset = Person.objects.filter(name="Joe").only("name") # Notice that I want to only select the name field.
object_list = list(queryset) # Purposefully triggered the database hit by calling list on it.

如何阻止执行此操作?:

object_list[0].age # accessing a field that I did not include in the "only" method triggers an additional hit to the database.

我希望它引发Exception或什么也不做,而不是第二次访问数据库。

更新:我已经回答了我自己的问题,但是我希望其他人发表他们的答案,看看他们是否有更好的解决方案。

hanpangzi2234 回答:如果在only()方法中未提供字段名,如何防止能够访问QuerySet对象的字段?

覆盖模型的refresh_from_db方法并引发AttributeError(如果调用)。

class Person(models.Model):
    name = models.CharField(max_length=50)
    age = models.IntegerField()

    def refresh_from_db(self,using=None,fields=None):
        """
        This method was overwritten because of the issues addressed in these tickets:
            https://code.djangoproject.com/ticket/26481
            https://code.djangoproject.com/ticket/22492
            https://code.djangoproject.com/ticket/30874
        """
        raise AttributeError(
            f'Cannot access {self.__class__.__name__}.{fields[0]} because the '
            'fieldname was not provided as an argument in the QuerySet.only() '
            'method.'
        )
,

安装并使用名为django-seal的第三方软件包。

本文链接:https://www.f2er.com/3113224.html

大家都在问