django.views / django.models,无法删除带有外键的实体

时间:2016-10-31 20:41:58

标签: python django django-models django-views

实际上我有两件似乎不起作用的东西。我将列出几个模型及其依赖项(缩短)。 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()

没有任何改变。我在控制台尝试了类似的东西,似乎没问题。尝试了一堆类似的代码。 试图将makemigrations添加到服务器重新启动但仍然没有结果。 有点django和webdev的Kinda noob,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

在你的行

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)

至于第二部分,将学生移到小组的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()))