覆盖模型中的get()方法

D_D*_*D_D 7 django django-models

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

broadcast = Broadcast.objects.get(request, pk = broadcast_id) 
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

两个问题 - >
我最重要的地方出错了?
如何访问传入get的"请求"参数?

小智 12

给出了Django教程中的民意调查app示例.您可以执行get操作以从数据库中获取轮询问题.

In : Question.objects.get(pk=1)
Out: <Question: Question object>
Run Code Online (Sandbox Code Playgroud)

这篇博客文章展示了如何覆盖该方法.它不在模型本身上.Question.objects 给你经理.

In : Question.objects
Out: <django.db.models.manager.Manager at 0x10d3b8860>
Run Code Online (Sandbox Code Playgroud)

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

class QuestionManager(models.Manager):
    pass

class Question(models.Model):
    objects = QuestionManager()
Run Code Online (Sandbox Code Playgroud)

这导致......

In : Question.objects
Out: <app.models.QuestionManager at 0x107456e48>
Run Code Online (Sandbox Code Playgroud)

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

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

class QuestionManager(models.Manager.from_queryset(QuestionQuerySet)):
    pass
Run Code Online (Sandbox Code Playgroud)

瞧!

In : Question.objects.get(pk=1)
hello world
Out: <Question: Question object>
Run Code Online (Sandbox Code Playgroud)

参考文献:


Dan*_*man 8

get不是模型上的方法 - 您可以通过objects它访问它,因此它是Manager上的方法.请参阅官方经理文档.

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

  • 不幸的是,您引用的文档没有重写`get`方法的明确示例. (5认同)