Модель Geodjango в сочетании с негео моделью
Я начинающий django и пытаюсь запрограммировать простое гео-приложение. Моя установка: django/geodjango + leaflet. Все работает хорошо и геообъекты (GeoObject) отображаются. Но теперь я хочу добавить дополнительные свойства ("статус") из другой модели и отобразить их также через leaflet - но я застрял.
my models.py:
class GeoObject(models.Model):
name = models.CharField(verbose_name="name", max_length=20)
location = models.PointField(srid=4326)
class Status(models.Model):
geoobject = models.OneToOneField(GeoObject, on_delete=models.CASCADE, primary_key=True, default=0, unique=True)
status = models.CharField(verbose_name="Sensor", max_length=20)
my views.py:
def GeoMapView(request): #view to display leaflet map with geo objects
q=Sensor.objects.all()
context = {'q':q}
return render(request, 'xitylytix_sensors/sensor_map.html', context)
def GeoData(request): #sending geo data
q=GeoObject.objects.all()
geo_data = serialize('geojson', q)
return HttpResponse(geo_data, content_type='json')
my urls.py
urlpatterns = [
path('geomap/', views.GeoMapView, name='geo_map'), #display via template/leaflet map
path('geodata/', views.GeoData, name='geo_data'), #sending geo data
]
json-данные:
{"type": "FeatureCollection", "crs": {"type": "name", "properties": {"name": "EPSG:4326"}}, "features": [{"type": "Feature", "properties": {"name": "001", "pk": "1"}, "geometry": {"type": "Point", "coordinates": [8.849315642079313, 50.07892796957105]}}, ...
Я пробовал с отношением один к одному (см. модель), но "статус" в json файле отсутствует в "свойствах". Есть ли у кого-нибудь идеи?
Почему вы пытаетесь это сделать? Вы можете просто создать объект в представлениях и добавить данные в модель GeoObject. Просто добавьте данные в вашу БД и после этого в представлениях вы можете добавить конкретные данные в вашу модель.
def GeoData(request):
q=GeoObject.objects.all()
for item in queyset:
GeoObject.objects.create(
something = item.queyset(data)
)
geo_data = serialize('geojson', q)
return HttpResponse(geo_data, content_type='json')
а если вы хотите получить доступ к данным в другой модели, вы должны использовать внешний ключ.
вы можете сериализовать ваши объекты без какого-либо фильтра и получить доступ к ожидаемому объекту с помощью Javascript во фронтенде. Этот метод уменьшает количество процессов на стороне сервера и увеличивает скорость. Когда вы используете метод value в бэкенде, сериализация не будет работать. Если вы настаиваете на этом, просто используйте метод (for item in queryset) и сохраните все, что вам нужно, в объекте. (iterate over quryset)
Я наконец-то нашел решение, которое работает для меня:
views.py:
def createleafletobject(q):
queryset = []
for element in table:
LeafObj = LeafletObject(
name = element['name'],
location = element['location'],
geoobject = element['geoobject'],
status = element['status],
)
queryset.append(LeafObj)
return queryset
def GeoMapView(request): #view to display leaflet map with geo objects
q=Sensor.objects.all()
context = {'q':q}
return render(request, 'xitylytix_sensors/sensor_map.html', context)
def GeoData(request): #sending geo data
q = Status.objects.all().values('geoobject__name', 'geoobject__location', 'geoobject', 'status')
q = createleafletobject(q)
geo_data = serialize('geojson', q)
return HttpResponse(geo_data, content_type='json')
Итак, что я делаю: запрашиваю данные из двух объектов через "values()", получаю словарь и преобразую с помощью написанного мной класса "createleafletobject(table)" в объект, который я сцериализую и передаю в leaflet.