覆盖模型中的get()方法

时间:2011-06-29 12:13:06

标签: django django-models

我试图在我的视图中覆盖get()方法:

broadcast = Broadcast.objects.get(request, pk = broadcast_id) 

在我的模型中,重写方法为:

class Broadcast(models.Model):      
    person = models.ForeignKey(User)
    post = models.CharField(max_length=300 , verbose_name = 'Say it out loud !')
    .
    .

    def get(self, *args, **kwargs):
        if request.user == self.person :
            super(Broadcast, self).get(*args, **kwargs)
        else :
            return none

两个问题 - >
压倒性的地方我哪里出错? 如何访问传入get的“请求”参数?

3 个答案:

答案 0 :(得分:9)

给出了Django教程中的民意调查应用示例。您可以执行get操作来获取轮询 来自数据库的问题。

In : Question.objects.get(pk=1)
Out: <Question: Question object>

此博客文章介绍了如何覆盖该方法。它不在模型本身上。 Question.objects 给你经理。

In : Question.objects
Out: <django.db.models.manager.Manager at 0x10d3b8860>

您可以在models.py中输入自定义管理器。

class QuestionManager(models.Manager):
    pass

class Question(models.Model):
    objects = QuestionManager()

导致......

In : Question.objects
Out: <app.models.QuestionManager at 0x107456e48>

但我们还没到那里。 Question.objects.get实际上正在做一些委托魔术 调用getSet的QuerySet实例。我们可以替换

class QuestionQuerySet(models.query.QuerySet):
    def get(self, **kwargs):
        print('hello world')
        return super().get(**kwargs)

class QuestionManager(models.Manager.from_queryset(QuestionQuerySet)):
    pass

瞧!

In : Question.objects.get(pk=1)
hello world
Out: <Question: Question object>

参考文献:

答案 1 :(得分:8)

get不是模型上的方法 - 您可以通过objects访问它,因此它是Manager上的一种方法。请参阅official Manager documentation

您定义方法签名的方式,请求可以args[0]

答案 2 :(得分:0)

请注意,更现代的Django版本(从1.7开始)提供了一种更简便的方法。检出as_manager() QuerySet方法。

https://docs.djangoproject.com/en/2.2/topics/db/managers/#creating-a-manager-with-queryset-methods