You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中获取待删除Bulle的关联Site外键并更新统计数

问题描述

我在phpMyAdmin中有两个通过外键关联的表:bulle表包含site表的外键。关联关系为:一个site可以包含多个(或零个)bulle,而一个bulle始终关联一个site。

对应的Django模型定义如下:

class Bulles(models.Model):
    id_bulle = models.AutoField(primary_key=True)
    num_bulle = models.CharField(max_length=20)
    type_bulle = models.CharField(max_length=20)
    colories = models.CharField(max_length=20)
    latitude = models.FloatField()
    longitude = models.FloatField()
    date_vidange = models.DateField(
        db_column="date_vidange"
    ) 
    id_depot = models.ForeignKey(
        "Depot", on_delete=models.CASCADE, db_column="id_depot"
    )
    id_site = models.ForeignKey(
        "Site",related_name='bul', on_delete=models.CASCADE, db_column="Id_site"
    )  
    class Meta:
        db_table = "bulles"

class Site(models.Model):
    id_site = models.AutoField(
        db_column="Id_site", primary_key=True
    ) 
    nom = models.CharField(
        db_column="Nom", max_length=100
    ) 
    vitesse_b = models.FloatField(db_column="Vitesse_b")  # Field name made lowercase.
    vitesse_c = models.FloatField(db_column="Vitesse_c")  # Field name made lowercase.
    ecart_type_b = models.FloatField(
        db_column="Ecart_type_b"
    ) 
    ecart_type_c = models.FloatField(
        db_column="Ecart_type_c"
    ) 
    type_site = models.CharField(
        db_column="Type_site", max_length=20
    ) 
    longitude = models.FloatField(db_column="Longitude") 
    latitude = models.FloatField(db_column="Latitude")  
    Nombre_bulles = models.IntegerField(db_column="Nombre_bulles")
    date_vidange = models.DateField(
        db_column="Date_vidange") 
    class Meta:
        db_table = "site"

我已编写了通过id_bulle(主键)删除bulle表中数据的视图函数:

def DeleteBulle (request, id_bulle):
    try:
        id_bulle
        param = Bulles.objects.get(pk=id_bulle)
        param.delete()
        print("Bulle supprimée")
    except:
        print("Cette bulle n'existe pas")
        return redirect('api_bulles_frontend')
    return redirect('api_bulles_frontend')

我需要实现以下需求:

  • 获取待删除bulle对象的Id_site外键值;
  • 统计该Id_site对应的所有bulles数量;
  • 将对应Site对象的Nombre_bulles字段更新为统计得到的数量。

目前我不清楚如何获取待删除bulle的Id_site值,希望得到帮助。


解决方案

要获取待删除bulle的Id_site值,只需在删除对象之前,通过已获取的Bulles实例访问外键字段即可。修改后的视图函数可完整实现你的三个需求:

def DeleteBulle(request, id_bulle):
    try:
        param = Bulles.objects.get(pk=id_bulle)
        # 1. 获取待删除bulle关联的site ID
        site_id = param.id_site_id
        
        # 删除目标bulle
        param.delete()
        print("Bulle supprimée")
        
        # 2. 统计该site下剩余的bulles数量
        remaining_bulles = Bulles.objects.filter(id_site_id=site_id).count()
        
        # 3. 更新对应Site的Nombre_bulles字段
        Site.objects.filter(id_site=site_id).update(Nombre_bulles=remaining_bulles)
        
    except Bulles.DoesNotExist:
        print("Cette bulle n'existe pas")
    except Site.DoesNotExist:
        print("Le site associé n'existe pas")
    return redirect('api_bulles_frontend')

核心要点:

  • 获取外键ID:param.id_site_id直接对应数据库中bulles表的Id_site字段值,无需额外查询Site表;若需完整Site对象,可使用param.id_site。
  • 高效统计:用filter().count()直接从数据库层面统计数量,性能优于先查询所有对象再计数。
  • 批量更新:使用update()方法直接更新数据库字段,比先get再save减少一次数据库查询,更高效。
  • 精准异常处理:替换通用except为具体的Bulles.DoesNotExist和Site.DoesNotExist,避免捕获无关错误。

内容的提问来源于stack exchange,提问作者lsn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:40:24