我有这些模范关系

class ExerciseCategory(models.Model):
    owner = models.ForeignKey(get_user_model(), on_delete=models.SET_NULL, blank=True, null=True)
    name = models.CharField(max_length=100)
class UserExercises(models.Model): #Through table for the many-to-many relationship between User and Exercise
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name="user")
    exercise = models.ForeignKey('Exercise', on_delete=models.CASCADE)

class Exercise(models.Model):
    category= models.ManyToManyField(ExerciseCategory, through='CategoryExercisesThrough',blank=True, null=True) 
    assignee = models.ManyToManyField(get_user_model(), blank=True, null=True, through=UserExercises, related_name="assignee", through_fields=('exercise', 'user'))

class CategoryExercisesThrough(models.Model): #Through table for the many-to-many relationship between ExerciseCategory and Exercise
    category= models.ForeignKey(ExerciseCollections, on_delete=models.CASCADE)
    exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE)

我想要获取给定用户的所有UserExercise,然后在我的模板中按类别分组显示它们,所以如果我有:{Ex1: {category: ["C1", "C2"]}, Ex2: {category: "C2"}},我希望它们像这样重新排序:{"C1": ["Ex1"], "C2": ["Ex2", "Ex1"]}

推荐答案

我建议手动对其进行后处理,因此:

from itertools import groupby
from operator import attrgetter

qs = (
    UserExercises.objects.filter(user=request.user)
    .annotate(category_id=F('exercise__category__pk'))
    .order_by('category_id')
)

result = {k: list(vs) for k, vs in groupby(qs, attrgetter('category_id'))}

这会将ExerciseCategory的主键映射到UserExercises的列表上,您还可以通过获取类别来进一步对其进行后处理:

categories = {ec.pk: ec for ec in ExerciseCategory.objects.filter(pk__in=result)}
result = {categories[k]: v for k, v in result.items()}

通常情况下,Django 模特的名字是singular,所以是UserExercise,而不是UserExercises.


Note:通常情况下,使用settings.AUTH_USER_MODEL [Django-doc]来引用用户模型比直接使用User model [Django-doc]要好.欲了解更多信息,您可以查看referencing the User model section of the documentation.

Django相关问答推荐

Django中的判断约束

Django ORM ForeignKey查询使用注释设置输出

Django查询一个查询集的输入结果,以查找没有出现在另一个模型中的对象

通过父模型查询子对象-Django

django re_path() 函数模式与包含该模式的 url 不匹配

django 无法识别实现自定义后端

DJANGO 获得模型中发现的第一、第二和第三大价值

有没有办法在Django中按需/点击仅获取和序列化一部分数据以提高性能?

使用django提交后如何保留html表单数据?

在 python 视图中检测移动浏览器

在 Scrapy 中访问 django 模型

如何在 django 中处理这种竞争条件?

如何在终端中切换 Python 版本?

django- nginx: [emerg] open() "/etc/nginx/proxy_params" 在 /etc/nginx/sites-enabled/myproject:11 中失败(2:没有这样的文件或目录)

如何在 Django 中向 ChoiceField 添加class?

Matplotlib - Tcl_AsyncDelete:异步处理程序被错误的线程删除?

Celery - 在一台服务器上运行不同的工作人员

Django:验证上传文件的文件类型

在 Django 单元测试中使用 mock 修补 celery 任务

django.urls.path中name参数的作用是什么?