我是Django的新手,我可以说我有像college
和department
这样的模态,如下所示
class College(models.Model):
name = models.CharField()
is_active = models.BooleanField()
class Department(models.Model):
name = models.CharField()
college = models.ForeignKeyField()
现在我有DepartmentListView
,DepartmentCreateView
,DepartmentUpdateView
等观点来列出,创建,更新部门。我想在添加,列出,更新部门之前检查college
的is_active(True)。目前我正在使用get_context_data
,如关注
def get_context_data(self, **kwargs):
context = super(DepartmentListView, self).get_context_data(**kwargs)
try:
college_id = self.kwargs.get('position_id')
context['college'] = College.objects.get(pk=college_id, is_active = True)
except College.DoesNotExist:
raise Http404
return context
但我正在重复相同的代码块,一次又一次,我想检查部门app中所有视图的大学is_active
。我可以实现这一点而不重复。
答案 0 :(得分:0)
为什么不在大学模型中创建一个类方法并在所有视图中使用它?
这是我的示例代码。
class College(models.Model):
name = models.CharField()
is_active = models.BooleanField()
def get_is_active(self):
return self.is_active
定义上面的方法,并在所有视图中使用如下所示。
College.objects.get(id=college_id).get_is_active()
答案 1 :(得分:0)
使用快捷方式get_object_or_404像这样:
my_object = get_object_or_404(MyModel, pk=1)
或者在您的具体案例中:
def get_context_data(self, **kwargs):
context = super(DepartmentListView, self).get_context_data(**kwargs)
college_id = self.kwargs.get('position_id')
context['college'] = get_object_or_404(College, pk=college_id, is_active=True)
return context
您还可以为您的College模型定义manger:
class CollegeManager(models.Manager):
def active(self):
return super(CollegeManager, self).get_queryset().filter(is_active=True)
class College(URLMixin, BaseModel):
objects = CollegeManager()
在您看来,您现在可以这样做:
get_object_or_404(College.objects.active(), pk=college_id)
请注意,.active()
还可以返回对列表有用的所有有效的College对象。
您的代码重复可以进一步减少。创建经理方法get_active
:
def get_active(self, pk):
return get_object_or_404(
super(CollegeManager, self).get_queryset().filter(is_active=True),
pk=pk
)
在视图中:
College.objects.get_active(college_id)
我从未尝试过最后一个get_active
示例,ymmv。