python - 如何在 Django 中过滤多对多字段中的某些项目
问题描述
我正在尝试在我的应用程序中创建一个公告系统,院长可以创建一个公告并选择他要发送给的学生。我想要一种方法来仅过滤他/她页面上的特定学生公告。
注意:通常,如果我在模板中编写代码 {{request.user}},我会得到“AnonymousUser”,这是预期的,因为没有实现普通的 django 用户模块,而是一个自定义用户模型。这表明 request.user.id 无效,因此我不能使用它来过滤。
我希望我能得到一些其他的方法来过滤每个学生的公告。
模型.py
class Announcement_by_dean(models.Model):
student_id = models.ManyToManyField(add_students_by_manager)
message = models.TextField()
sent_date = models.DateField(default=datetime.now(), blank=True)
updated_date = models.DateField(auto_now=True, blank=True)
def __str__(self):
return self.id
class add_students_by_manager(models.Model):
manager_ID = models.ForeignKey(Manager_login_information, on_delete=models.CASCADE)
student_ID = models.CharField(max_length=200)
student_name = models.CharField(max_length=200)
phone_number = models.CharField(max_length=200)
address = models.CharField(max_length=200)
dob = models.CharField(max_length=200)
major = models.CharField(max_length=200)
password = models.CharField(max_length=200)
def __str__(self):
return self.student_name
视图.py
def student_course_list(request):
stu_course_id = request.POST.get('stu_course_id')
my_announcement = Announcement_by_dean.objects.filter(student_id=request.user.id).order_by('-sent_date')
print(my_announcement)
context = {"my_announcement":my_announcement}
return render(request, "student_course_list.html", context)
解决方案
问题似乎是您正在尝试将模型实例与该实例的 ID 进行比较。将其更改为此应该可以解决问题:
my_announcement = Announcement_by_dean.objects.filter(student_id__id=request.user.id).order_by('-sent_date')
正如您在上面的示例中看到的那样,您的命名约定有点令人困惑。您可能需要考虑阅读一下 django 编码风格:https ://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/
如果不是登录用户 (request.user),那么您可以在 URL 中传递学生 ID,如下所示:www.yourdomain.com/yourviewurl/ ?student_id= <> 然后将代码更改为:
def student_course_list(request):
stu_course_id = request.POST.get('stu_course_id')
my_announcement = Announcement_by_dean.objects.filter(student_id=request.GET['student_id']).order_by('-sent_date')
或者您可以在 urls.py 中指定捕获的值(请参见此处:https ://docs.djangoproject.com/en/3.1/topics/http/urls/ )并将您的代码更改为:
def student_course_list(request, student_id):
stu_course_id = request.POST.get('stu_course_id')
my_announcement = Announcement_by_dean.objects.filter(student_id=student_id).order_by('-sent_date')
推荐阅读
- python-3.x - 如何在循环中给图表一个带有迭代器值的标题?
- c# - 在 .NET 中使用 PascalCase 属性名称创建 API 模型,但序列化为 CamelCase
- javascript - 运行节点 SS2 exec 命令的简单方法
- python - 以科学风格设置自定义刻度的精度
- python-3.x - 如何提取过去 4 个月的 Twitter 挖掘数据
- microservices - 尤里卡超时异常
- wix - Wix:在使用引导程序时显示 WixUI_minimal
- wordpress - 如何将 wordpress 与 amazonaws 连接起来
- botframework - 自适应卡:付款请求
- python - 如何将 Pi Camera 给出的图像输入直接存储到变量而不是文件中?