因此,這裏是我的很好的功能:簡化Django的ORM查詢
def is_serviceable(address):
"""
Checks if an address can be serviced by an Employee.
Returns True if address' lat-lng intersects with any of Employees' coverage.
If it doesn't, but address' locality is listed in world District model,
returns False and locality name.
Just returns False if nothing found.
-- address -- django-address Address object. Address should be geocoded (i.e
have latitude and longitude fields correctly filled)
"""
pnt = Point(address.longitude, address.latitude)
employee_exists = Employee.objects.filter(coverage__mpoly__intersects=pnt).exists()
district = District.objects.filter(mpoly__intersects=pnt).first()
if (employee_exists):
return employee_exists
elif district:
return False, district.name
else:
return False
得到我想要我必須執行兩個數據庫查詢什麼,首先要Employee表,然後到區表。這似乎不是一種可擴展的方法。然而,由於員工的覆蓋屬性實際上是與區模型許多一對多關係領域:
class Employee(models.Model):
coverage = models.ManyToManyField(
District,
related_name="employees",
verbose_name=_("assigned districts")
)
class District(models.Model):
mpoly = models.MultiPolygonField()
...我敢肯定,有一種方法來查詢壓縮到一個查詢集,或者,如果Django的ORM不適合這種單一的SQL語句。不過,我不知道從哪裏開始挖掘。有什麼想法嗎?
編輯:解決感謝Django的註釋功能。
謝謝!註釋非常酷,正是我所需要的。 – khvn
@khvn - 不用擔心,盡情享受吧!你可以通過改變'elif'到'if區域'來刪除檢查'emp'(s)兩次。 – Sayse
很好的結果。再次感謝! – khvn