我有两个表主题表和日表。主题列表是白天的m2m。所以我的问题是我正在制定学校时间表。因此,对于每一天不同的主题,当我在每一天添加主题时,主题的顺序是相同的。
#Models.py
class SubjectList(models.Model):
subject_name = models.CharField(max_length=25)
def __str__(self):
return self.subject_nameclass 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
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)我想这样做
星期一-英语,数学,科学,社会科学星期二-数学,社会科学,英语,数学
但我就是这样
星期一-英语,数学,科学,社会科学星期二-英语,数学,科学,社会科学

即使按不同的顺序添加主题,两者的顺序也是相同的。
发布于 2022-10-28 20:39:42
可以向M2M表中添加更多字段,方法是声明模型并将其分配给具有直通参数的M2M关系。
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字段。
my_day.subject_name.add(my_subject, through_defaults={"position": my_position})您可以使用related_name订购
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()时,才会排序记录
如果更方便的话,您可以将这些记录以另一个名称存储。
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。
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)发布于 2022-11-01 12:04:05
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.https://stackoverflow.com/questions/74235258
复制相似问题