django - 重写模型中的 get() 方法

标签 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 的“request”参数?

最佳答案

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

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

这篇博文展示了如何重写该方法。它不在模型本身上。 问题.对象 给你经理。

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 正在做一些委托(delegate)魔法,实际上 对 QuerySet 实例调用 get。我们可以替换

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>

引用文献:

关于django - 重写模型中的 get() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6520445/

相关文章:

Django 从 smtp.office365.com 发送邮件

python - 过滤 Django 数据库中包含数组中任何值的字段

python - Django -- 新字段 : How to set default callable for existing objects

django - 使用 Django 1.7 创建部分索引

python - Django:.annotate 返回意外结果

javascript - 如何在 Django 项目中下载 python-docx 生成的文档?

django - 为什么collectstatic无法复制我的静态文件?

用于存储用户日常事件的 SQL 表结构

Django 模型没有保存.. 在这里完全糊涂了

django - 在 virtualenv 中创建项目时没有名为 django.core 的模块