Skip to main content
 首页 » 编程设计

python之如何删除有条件的对象

2025年05月04日14EasonJim

我的模型

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}) 

我试过了,还是不行

请您参考如下方法:

条件是 not user.email.exists() and not user.phone,因为 not 优先于 and 和或:

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

因此,如果email 和phone 都为空(具有真实性假)。

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

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

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