首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django多到多序

Django多到多序
EN

Stack Overflow用户
提问于 2022-10-28 12:14:58
回答 2查看 43关注 0票数 0

我有两个表主题表和日表。主题列表是白天的m2m。所以我的问题是我正在制定学校时间表。因此,对于每一天不同的主题,当我在每一天添加主题时,主题的顺序是相同的。

#Models.py

代码语言:javascript
复制
class SubjectList(models.Model):
    subject_name = models.CharField(max_length=25)

    def __str__(self):
        return self.subject_name
代码语言:javascript
复制
class Day(models.Model):
    day_name = models.CharField(max_length=15)
    subject_name = models.ManyToManyField(SubjectList)
    class_number = models.ForeignKey(AddClass, on_delete=models.CASCADE, null=True, blank=True)
    start_time = models.TimeField(null=True, blank=True)
    end_time = models.TimeField(null=True, blank=True)

    def __str__(self):
        return self.class_number.class_number

#Views.py

代码语言:javascript
复制
class TimeTableView(APIView):
    def get(self, request, id):
        class_number = AddClass.objects.get(id=id)
        day = Day.objects.filter(class_number=class_number.id)
        print(day)
        serializer = DaySerializer(day, many=True)
        return Response(serializer.data)

我想这样做

星期一-英语,数学,科学,社会科学星期二-数学,社会科学,英语,数学

但我就是这样

星期一-英语,数学,科学,社会科学星期二-英语,数学,科学,社会科学

即使按不同的顺序添加主题,两者的顺序也是相同的。

EN

回答 2

Stack Overflow用户

发布于 2022-10-28 20:39:42

可以向M2M表中添加更多字段,方法是声明模型并将其分配给具有直通参数的M2M关系。

代码语言:javascript
复制
class DaySubjectList(models.Model):
    day =  models.ForeignKey(Day, on_delete=models.CASCADE, related_name="day_subject_lists")
    subject_list =  models.ForeignKey(SubjectList, on_delete=models.CASCADE, related_name="day_subject_lists")
    order = models.IntegerField(default=0)

class Day(models.Model):
    day_name = models.CharField(max_length=15)
    subject_name = models.ManyToManyField(SubjectList, through=DaySubjectList)
    class_number = models.ForeignKey(AddClass, on_delete=models.CASCADE, null=True, blank=True)
    start_time = models.TimeField(null=True, blank=True)
    end_time = models.TimeField(null=True, blank=True)

    def __str__(self):
        return self.class_number.class_number    

可以使用相关管理器的through_defaults参数设置order字段。

代码语言:javascript
复制
my_day.subject_name.add(my_subject, through_defaults={"position": my_position})

您可以使用related_name订购

代码语言:javascript
复制
Day.objects.filter(class_number=class_number.id).prefetch_related(Prefetch("day_subject_lists", queryset=DaySubjectList.objects.order_by("position")))

只有当您访问my_day.day_subject_lists.all()而不是my_day.subject_name.all()时,才会排序记录

如果更方便的话,您可以将这些记录以另一个名称存储。

代码语言:javascript
复制
Day.objects.filter(class_number=class_number.id).prefetch_related(Prefetch("day_subject_lists", queryset=DaySubjectList.objects.order_by("position"), to_attr="my_prefered_name"))

请注意,my_day.my_prefered_name是一个列表,而不是查询,所以不要使用.all()来访问它。

使用您的模型相互引用有任何问题,您可以使用字符串synthax。

代码语言:javascript
复制
class DaySubjectList(models.Model):
    day =  models.ForeignKey("myapp.Day", on_delete=models.CASCADE, related_name="day_subject_lists")
    subject_list =  models.ForeignKey("myapp.SubjectList", on_delete=models.CASCADE, related_name="day_subject_lists")
    order = models.IntegerField(default=0)
票数 0
EN

Stack Overflow用户

发布于 2022-11-01 12:04:05

代码语言:javascript
复制
You need to specify an order for the m2m relation [Django-doc]:
class Day(models.Model):
    # ...
    subject_name = models.ManyToManyField(
        SubjectList,
        ordered=True
    )
    # ...
Now if you query a Day object, the related SubjectList objects will be ordered in the order you added these.
You can further alter the order with .move(...), or .reorder(...).
Note: You should rename the subject_name field to subjects, since it relates to multiple SubjectList objects. A ForeignKey or OneToOneField indeed often uses the _name suffix, since these relate to at most one other object, but a ManyToManyField does not have this limitation.

Note: You should not use ForeignKey(.., null=True)s. A foreign key represents a relation, and a relation can not be "NULL". You should make these fields not nullable, and make the related model have a nullable parent relation (with null=True), or make the field optional with blank=True.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74235258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档