如何为Django模型设置双向匹配条件 不分顺序查询城市距离数据
你想要的写法思路是正确的,只需要配合Django的Q对象实现逻辑或查询即可,同时你给出的示例查询条件里存在笔误,第二个条件的第一个筛选字段应为key_first。
具体实现步骤
- 先导入
Q对象
from django.db.models import Q
- 单次查询即可得到结果:
distance = Distance.objects.get( Q(key_first=firstcity, key_second=secondcity) | Q(key_first=secondcity, key_second=firstcity) )
进阶优化
如果需要频繁使用该查询逻辑,可以封装到模型自定义管理器中,复用性更高:
from django.db import models from django.db.models import Q class DistanceManager(models.Manager): def get_between_cities(self, city_a, city_b): return self.get( Q(key_first=city_a, key_second=city_b) | Q(key_first=city_b, key_second=city_a) ) class Distance(models.Model): # 原有字段定义 key_first = models.CharField(max_length=64) key_second = models.CharField(max_length=64) distance_value = models.FloatField() objects = DistanceManager()
封装后调用方式更简洁:
distance = Distance.objects.get_between_cities(firstcity, secondcity)
注意事项
- 需要保证数据库中不会同时存在
(A,B)和(B,A)两条重复的距离数据,否则调用get()会抛出MultipleObjectsReturned异常 - 如果不存在对应城市的距离数据,会抛出
DoesNotExist异常,可根据业务需求自行捕获处理
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

