Модель 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.

Вернуться на верх