如何在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
相关产品推荐
相关产品推荐

