0

我有一个 Django 应用程序,每个用户都可以添加具有多个可能指标(宽度、高度和长度组合)的产品。用户还必须指定该产品位于哪个城市。用户还可以在数据库中搜索与特定指标匹配的所有产品。我使用 Django 1.11 并正在寻找一种解决方案,以在交互式地图上显示与查询集匹配的所有产品。

我正在尝试使用django-leafletdjango-geojson 来实现(因为我的数据库不是面向 gis 的,我不需要繁重的地理计算),但我面临一些困难,因为我的“PointField”不在我的产品模型但在位置模型和地图上我需要显示产品属性,因此我必须将所有这些数据一起序列化。

如果您更喜欢代码而不是文字,这里是我的相关文件的简化版本。

#models.py

class Product(models.Model):
    name = models.CharField()
    owner = models.ForeignKey(User)
    photo = models.ImageField(...)
    dimensions = models.ManyToManyField(Metrics)
    location = models.ForeignKey(Location, related_name='products', related_query_name='product')

class Metrics(models.Model):
   width = models.PositiveIntegerField()
   height = models.PositiveIntegerField()
   length = models.PositiveIntegerField()

class Location(models.Model):
   zip_code = models.PositiveIntegerField()
   city_name = models.CharField()
   slug = models.SlugField(max_length=500, blank=True)
   geom = PointField(default={'type': 'Point', 'coordinates': [0, 0]})


#views.py

class SearchResultListView(ListView):
     model = models.Product
     template_name='my_app/searchresult_list.html'
     context_object_name = 'product_list'

     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         query_width = self.request.GET['width']
         query_height = self.request.GET['height']
         query_length = self.request.GET['length']
         context['product_list'] = context['product_list'].filter(metrics__width=query_width, 
         metrics__length=query_length, metrics__height=query_height)
         return context

#urls.py

????

#template.html

????

我在 django-geojson 文档中看到了多种访问数据库的方法(GeoJSON 层视图、Tiled GeoJSON 层视图、GeoJSON 模板过滤器、低级序列化)。但是我很难找到满足我需求的方法,因为我的属性在产品模型中,我的坐标在位置模型中,而我的查询集在不相关的基于类的视图中。

对执行我的任务的最佳方式有任何想法吗?我应该继续使用 django-geojson 还是有更好的应用程序适合我的目的?

4

1 回答 1

0

您的产品和位置看起来不错,但不清楚您要使用 Metrics 做什么。要选择某个地方附近的产品,您需要以下内容:

queryset = Product.objects.filter(location__geom__distance_lt=(someLocation, D(m=50)))

https://docs.djangoproject.com/en/3.0/ref/contrib/gis/geoquerysets/#distance-lt

于 2019-12-18T16:41:35.887 回答