Django ManytoMany 字段在调用 .add() 方法后仍为空



我正在使用django创建一个注册平台,学生可以在其中注册每周的课程。 每个类都是一个名为ClassCards的 django 模型,它与User称为signed_up_student的模型具有 ManytoMany 关系,该模型表示注册该类的所有用户,如下所示

class ClassCards(models.Model):
content = models.CharField(max_length=100, default = '')
date = models.DateField(blank=True, null = True)
time = models.TimeField(blank=True,null=True)
signed_up_students = models.ManyToManyField(User,blank=True)
full = models.BooleanField(default = False)
max_students = models.IntegerField(default=4)
teacher = models.CharField(max_length=100, default='Adi')

我想添加一个订阅选项,该选项将自动为订阅的学生注册本周的课程。这是我Subscription模型:

class Subscriptions(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null =True)
day = models.CharField(max_length=100, choices=day_choices, null=True)
time = models.TimeField(blank=True, null=True)
num_of_times_used = models.IntegerField(default=0)
cap = models.IntegerField(default=52)
active = models.BooleanField(default= True)
expirey_date = models.DateField()
date_created = models.DateField(default = timezone.now)

为了实现这一点,我创建了一个post_save信号:

@receiver(post_save,sender=ClassCards)
def apply_subsciptions(sender,instance,created, **kwargs):
if created:
subs = Subscriptions.objects.filter(day=instance.date.strftime("%A"), 
time=instance.time)
for s in subs:
instance.signed_up_students.add(s.user)
print(instance.signed_up_students.get())

保存ClassCards时,代码正常运行,而不会引发任何错误,并且 print 语句会打印相关User但是,当我查看管理页面时,我看到signed_up_students字段中没有用户。 我想了解为什么这不能按预期工作,这应该将该用户添加到ManytoMany字段中,以及自动更新ManytoMany字段的最佳实践是什么。

对类类卡稍作修改

class ClassCards(models.Model):
signed_up_students = models.ManyToManyField(User, symmetrical=False, related_name="student_cards_students_has", blank=True)

def signed_students_list(self):
return self.signed_up_students.all()
def cards_asigned_to_student_list(self):
return self.student_cards_students_has.all()
def assign_student(self, user):
self.signed_up_students.add(user)
def unsign_user(self, user):
self.signed_up_students.remove(user)

现在在信号中

@receiver(post_save,sender=ClassCards)
def apply_subsciptions(sender,instance,created, **kwargs):
if created:
subs = Subscriptions.objects.filter(day=instance.date.strftime("%A"),time=instance.time)
for s in subs:
instance.assign_student(s.user)
instance.save()
print(instance.signed_students_list())
print(instance.cards_asigned_to_student_list())

最新更新