我试图在我的视图中覆盖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的“请求”参数?
答案 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