django.views / django.models,不能删除带有外键的实体



实际上我有两件事似乎不起作用。我将列出几个模型和它们的依赖关系(简称)。StudentGroup有学生(可能是活动的/不活动的)和消息,它们被列为聊天。

在views.py中,当我调用delete_group()时,我想使所有学生处于非活动状态,并删除与该组相关的所有消息。

class StudentsGroup(models.Model):
    students = models.ManyToManyField(User,limit_choices_to={'is_staff': False}, related_name="user_groups",blank=True)
    finished = models.ManyToManyField(User,limit_choices_to={'is_staff': False}, related_name="finished_user_groups",blank=True)

class Message(models.Model):
    group=models.ForeignKey(StudentsGroup)

def delete_group(request,group):
    Message.objects.filter(group=group).delete()
    groupl=StudentsGroup.objects.get(id=group)
    for s in group1.students.all():
        groupl.finished.add(s)
        group1.save()

没有变化。我在主机上也尝试过类似的做法,结果似乎还不错。尝试了一些类似的代码。尝试在服务器重新启动时添加makemigration,但仍然没有结果。在django和webdev方面有点新手,任何帮助都会很感激。

在你的行

Message.objects.filter(group=group).delete()

看起来您还没有将group从原始ID值转换为实际的StudentGroup实例。如果group作为StudentGroup实例提供给该函数,那么这应该可以工作。如果,正如我怀疑的那样,group只是一个原始ID值,那么您的过滤器查询应该是:

Message.objects.filter(group_id=group).delete()

使用对象比使用id更好。试着这样做:

group = StudentGroup.objects.get(id=group)
Message.objects.filter(group=group).delete()

然后你可以做其他事情,如group = get_object_or_404(StudentGroup, id=group)

至于第二部分,将Students移动到组的finished列表,您的代码看起来很合理,尽管您不需要.save()部分。我怀疑这些错误可能是由于对象还没有被正确实例化,就像上面那样。

但是你应该能够在Django 1.9+的一行中完成所有这些,参见https://docs.djangoproject.com/en/1.10/ref/models/relations/#django.db.models.fields.related.RelatedManager.add
group1.finished.add(*list(group1.students.all()))

最新更新