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)
参考文献:
| 归档时间: |
|
| 查看次数: |
9930 次 |
| 最近记录: |