Django新手求助:自定义管理器命名及按legacy_user_id过滤QuerySet
解决Django自定义Manager命名及筛选逻辑问题
1. 关于SOMETHING的命名
你可以给这个自定义Manager实例起一个语义化的名字,比如legacy_filtered_classes、user_courses或者filtered_by_user,只要符合Python变量命名规范,且能清晰表达它的用途即可。这个名字完全由你根据业务场景定义。
2. 修正自定义Manager的错误写法
你当前的OldClassesManager.get_queryset()代码存在问题:filter(LegacyUser.legacy_id)是无效的筛选语法,filter()方法需要接收字段名=筛选值的键值对参数,而非直接传入模型字段。
3. 按legacy_user_id筛选课程的可行方案
方案1:直接在视图中筛选(适合简单场景)
如果只是单一视图需要筛选逻辑,无需自定义Manager,直接在ListView的get_queryset方法中处理:
models.py
from django.db import models from account.models import Profile, LegacyUser class OldInstructables(models.Model): legacy_user_id = models.IntegerField(null=False) name = models.CharField(max_length=100, blank=False) # [other stuff] def __str__(self): return self.name
views.py
from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic.list import ListView from account.models import LegacyUser from .models import OldInstructables class OldClassList(LoginRequiredMixin, ListView): model = OldInstructables def get_queryset(self): # 获取当前登录用户对应的LegacyUser实例 legacy_user = LegacyUser.objects.get(user=self.request.user) # 筛选匹配legacy_user_id的课程 return super().get_queryset().filter(legacy_user_id=legacy_user.legacy_id)
方案2:使用自定义Manager(适合复用筛选逻辑的场景)
如果多个视图或业务逻辑都需要按legacy_user_id筛选,自定义Manager可以避免代码重复:
models.py
from django.db import models from account.models import Profile, LegacyUser class OldClassesManager(models.Manager): # 定义接收legacy_id参数的筛选方法 def filter_by_legacy_id(self, legacy_id): return self.get_queryset().filter(legacy_user_id=legacy_id) class OldInstructables(models.Model): legacy_user_id = models.IntegerField(null=False) name = models.CharField(max_length=100, blank=False) # [other stuff] objects = models.Manager() # 保留默认Manager,用于常规查询 filtered_classes = OldClassesManager() # 这里就是你要填的SOMETHING def __str__(self): return self.name
views.py
from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic.list import ListView from account.models import LegacyUser from .models import OldInstructables class OldClassList(LoginRequiredMixin, ListView): model = OldInstructables def get_queryset(self): legacy_user = LegacyUser.objects.get(user=self.request.user) # 使用自定义Manager的筛选方法 return OldInstructables.filtered_classes.filter_by_legacy_id(legacy_user.legacy_id)
内容的提问来源于stack exchange,提问作者JJ Ryan
相关产品推荐
相关产品推荐

