首页 > 解决方案 > 如何在视图中删除带有条件的obj

问题描述

我的模型

class User(models.Model):
    name = models.CharField(max_length=50)
    surname = models.CharField(max_length=50)


class Phone(models.Model):
    user = models.ForeignKey(Osoba, editable=False, related_name='phone', on_delete=models.CASCADE)
    phone = models.CharField(max_length=50)

class Email(models.Model):
    user = models.ForeignKey(Osoba, editable=False, related_name='email', on_delete=models.CASCADE)
    email = models.EmailField()


我希望只有在他的字段中没有值的情况下才能删除一个对象

def delete_user(request, id):
    user = User.objects.get(id=id)

    if not user.email or user.phone:
        if request.method == 'POST':
            user.delete()
            print(user.email)
            return redirect('list_users')


    return render(request,'index-delete.html', {'user': user})

我试过了,但它不起作用

标签: pythondjangodjango-orm

解决方案


条件是not user.email.exists() and not user.phone,因为not优先于andand or

def delete_user(request, id):
    user = User.objects.get(id=id)
    if request.method == 'POST':
        if not user.email.exists() and not user.phone.exists():
            user.delete()
            return redirect('list_users')
    return render(request,'index-delete.html', {'user': user})

因此,如果和均为空白(具有真实性),则此处user将被删除。emailphoneFalse

我们可以通过在数据库中搜索来提高效率:

def delete_user(request, id):
    if request.method == 'POST':
        done, __ = user.objects.filter(id=id, email=None, phone=None).delete()
        if done:
            return redirect('list_users')
    user = User.objects.get(id=id)
    return render(request,'index-delete.html', {'user': user})

在这里,我们因此在数据库上执行 JOIN,以便通过一次查询知道用​​户是否没有电子邮件和电话。


推荐阅读