【问题标题】:django many to many field filter using created timedjango 使用创建时间的多对多字段过滤器
【发布时间】:2016-06-22 13:58:12
【问题描述】:

我有一个名为ClassRoom的模型,

class ClassRoom(model.Model):
    class_name = models.CharField(max_lenth=100)
    students = models.ManyToManyField(User)

view.py 这样。

def addstudents(request):
    class_room = ClassRoom.objects.get(id=1)
    class_name.students.add(request.user)

我像这样将学生添加到ClassRoom。 我想列出今天上课的所有学生。 如何通过 their joining time 过滤这些学生?

当我们使用 django ManyToManyField 时,django 在数据库中创建一个额外的表。在该表中包含created 时间。我可以使用此字段进行过滤吗?

【问题讨论】:

  • 定义“今天加入”,您如何跟踪他们加入的日期?..
  • 这是我的问题。在数据库中,django 为这个 many2many 创建了一个额外的表。在该表中包含创建日期。我们可以使用该表创建的字段值进行过滤吗?
  • 您确定有created 字段吗?如果是,你可以用它来过滤
  • 因此您可以使用class_room.students.filter(created=datetime.today()),其中class_roomClassRoom 实例

标签: python django many-to-many


【解决方案1】:

您可以使用自定义表 (docs here) 向 M2M 关系表添加额外字段。

class ClassRoom(models.Model):
    class_name = models.CharField(max_length=100)
    students = models.ManyToManyField(User, through='ClassMate')


class ClassMate(models.Model):
    class_room = models.ForeignKey(ClassRoom, on_delete=models.CASCADE)
    user = model.ForeignKey(User, on_delete=models.CASCADE)
    date_joined = models.DateField(auto_now_add=True)

那么你可以这样做:

class_room = ClassRoom.objects.get(...)

class_room.students.filter(date_joined=datetime.today())

请记住(正如文档所说)现在您必须实例化 ClassMate 对象才能添加关系:

class_room = ClassRoom.objects.get(...)
user = request.user
class_mate = ClassMate(class_room=class_room, user=user)
class_mate.save()

【讨论】:

  • 该用户已被创建。现在该用户已添加到教室。用户创建时间和用户添加到课堂时间,两者是不同的。
  • 用户创建时间不在此处,date_joined 将占用您使用ClassRoomUser 实例创建ClassMate 实例的时间
猜你喜欢
  • 2020-03-20
  • 2018-06-07
  • 2015-07-18
  • 1970-01-01
  • 2016-12-13
  • 2018-05-25
  • 2021-12-13
  • 2011-07-26
  • 1970-01-01
相关资源
最近更新 更多