Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.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:如何继承和重写具有queryset的方法?_Python_Django_Inheritance - Fatal编程技术网

Python:如何继承和重写具有queryset的方法?

Python:如何继承和重写具有queryset的方法?,python,django,inheritance,Python,Django,Inheritance,我有2类A和B: class A(ListView): model=Model_name def get_queryset(self): instance = self.get_user_by_credential(...) if instance: model_instance = self.model.objects.get(id=instance.id)

我有2类
A
B

class A(ListView):
        model=Model_name
        def get_queryset(self):
            instance = self.get_user_by_credential(...)
            if instance:
                model_instance = self.model.objects.get(id=instance.id)
                some_objects= self.Model_name.objects.filter(content_id=5, object_id=model_instance.id)
                return some_objects
            return []



class B(A,UserObject):
      model=B_model
      param='foo'
      def get_queryset(self):
            instance = self.get_user_by_credential(...)
            if instance:
                model_instance = self.model.objects.get(id=instance.id, param=param)
                some_objects= Model_name.objects.filter(content_id=5, object_id=model_instance.id)
                return some_objects
            return []
这两个类之间的区别只是
B
queryset中的
param


如何重写父类
A
的方法并向子类
B
的查询集添加一个参数?

您可以创建一个
get\u model\u instance
方法,然后在A实现中使用该方法,以便可以删除B中的实现

def get_model_instance(self):
    instance = self.get_user_by_credential(...)
    if instance:
         return self.model.objects.get(id=instance.id)
    return None

def get_model_instance(self):
    instance = self.get_user_by_credential(...)
    if instance:
         return self.model.objects.get(id=instance.id, param=param)
    return None
或者按照丹尼尔·罗斯曼的建议

def get_model_instance(self, instance):
     ...

您只需创建一个
get\u model\u instance
方法,然后在a实现中使用该方法,以便在B中删除该实现

def get_model_instance(self):
    instance = self.get_user_by_credential(...)
    if instance:
         return self.model.objects.get(id=instance.id)
    return None

def get_model_instance(self):
    instance = self.get_user_by_credential(...)
    if instance:
         return self.model.objects.get(id=instance.id, param=param)
    return None
或者按照丹尼尔·罗斯曼的建议

def get_model_instance(self, instance):
     ...

感谢您的回答,但是
实例.id
来自
if。。else
语句。我无法用其他方法创建它。@pietá-将其移动到get实例,或将其保存在
get\u queryset
中,但将其作为参数传递给
get\u model\u实例。
。感谢您的回答,但是
实例.id
来自
if。。else
语句。我无法用其他方法创建它。@pietá-将其移动到get实例,或将其保存在
get\u queryset
中,但将其作为参数传递给
get\u model\u实例。我不明白为什么要获取ID为user对象的B\u模型对象。你怎么知道他们会有相同的ID?我有很多用户配置文件..我必须获取当前活动用户的模型对象要获取当前登录用户的模型对象,请使用
request.user
;否则你就会有一个安全漏洞,任何人都可以通过在查询字符串中尝试不同的ID来查看其他用户的数据。我不明白为什么你会得到一个ID为用户对象的B_模型对象。你怎么知道他们会有相同的ID?我有很多用户配置文件..我必须获取当前活动用户的模型对象要获取当前登录用户的模型对象,请使用
request.user
;否则,就会出现一个安全漏洞,任何人都可以通过在查询字符串中尝试不同的ID来查看其他用户的数据。