2 回答
TA贡献1802条经验 获得超5个赞
主要问题是获取要批量链接的对象。一旦我们存储了所有这些对象,我们就可以批量获取对象:
from django.db.models import Q
points_models = [
LocationPoint(latitude=point.latitude, longitude=point.longitude)
for point in points
]
LocationPoint.objects.bulk_create(
points_models,
ignore_conflicts=True
)
qfilter = Q(
*[
Q(('latitude', point.latitude), ('longitude', point.longitude))
for point in log_entries
],
_connector=Q.OR
)
data = {
(lp.longitude, lp.latitude): lp.pk
for lp in LocationPoint.objects.filter(qfilter)
}
geo_log_entries = [
GeoLogEntry(
device=entry.device,
location_point_id=data[entry.longitude, entry.latitude],
recorded_at=entry.recorded_at
)
for entry in log_entries
]
GeoLogEntry.objects.bulk_create(geo_log_entries, ignore_conflicts=True)
因此,我们批量获取需要链接到的所有对象(因此使用一个查询),创建一个映射主键上的经度和纬度的字典,然后设置为该点location_point_id。
然而,重要的是使用小数,或者至少是一种匹配的类型。浮点数很棘手,因为它们很容易产生舍入误差(因此经度和纬度通常存储为“定点”数字,例如整数大 1'000 倍或大 1'000'000 倍)。否则,您应该使用将其与通过查询生成的数据相匹配的算法。
TA贡献1873条经验 获得超9个赞
bulk_create(...)将以列表形式返回您创建的对象。您可以在 Python 端过滤这些对象,而不是查询数据库,因为它们已经被获取。
location_points = LocationPoint.objects.bulk_create(
points_models,
ignore_conflicts=True
)
geo_log_entries = map(
lambda log_entry: GeoLogEntry(
device=device,
location_point=get_location_point(log_entry, location_points),
recorded_at=log_entry.recorded_at
),
log_entries
)
GeoLogEntry.objects.bulk_create(geo_log_entries, ignore_conflicts=True)
您所需要做的就是实现get_location_point满足您的需求
添加回答
举报