В моем приложении django есть следующая модель:
Project
BuildingCollection (belongs to Project)
Building (belongs to BuildingCollection)
SpecificValue (belongs to Building)
Модель SpecificValue имеет поле JSON с большим количеством ключей и значений, например {1:value2, 2: value2, 3:value3.....}
. Модель SpecificValue также имеет поле выбора, которое имеет 3 варианта типов.
Я пытаюсь запросить следующее через URL, который выглядит следующим образом: path('blbla/<str:project>/<str:type>/<str:key>/', blbla.as_view())
В псевдокоде я хочу запросить это:
Дайте мне всеЗдания самой последней BuildingCollection проекта передаются в мой URL. Затем дайте мне все SpecificValues этих зданий, но только те, тип которых был передан в URL. И, наконец, дайте мне из всех этих SpecificValues только значения для указанного ключа в поле JSON.
Затем я хочу написать это в словаре, говоря: {"Building1" : valueofJSONField, "Building2" : valueofJSONField }
Надеюсь, я ясно понимаю, что говорю. Я пытаюсь это с помощью следующего (перезаписывая метод get REST APIView)
class MyClass(APIView):
def get(self, request, **kwargs):
project = kwargs.get('project')
type = kwargs.get('type')
key = kwargs.get('key')
building_group_most_recent = BuildingCollection.objects.filter(
project__project_name=project).order_by('-creation_date').first() #I get mostrecent
buildings = building_collection_most_recent.buildings.all() ##all buildings
specific_value = buildings.specific_value.all() ##ERROR HERE ==> buildings has no specific_value_set
Я думаю, что ошибка происходит, потому что в моих зданиях много объектов. Я мог бы зацикливаться и выдвигать список, но тогда они отключались от здания.
Я также попробовал другой способ, например:
building_by_spec_values = SpecificValues.objects.filter(
building__buildingcollection__project=project,
type__exact=type,
value__has_key=key). \
order_by('-timestamp'
)
Проблема здесь в том, что мне нужно пропустить только один экземпляр здания, или я получаю ошибку The QuerySet value for an exact lookup must be limited to one result
.
Я знаю, что могу получить значение из поля JSON с помощью __has_key.
, как объяснено в документации django, но путь до поля JSON вызывает у меня проблемы. Неважно, в какую сторону я застрял, как запросить все это до конца.
Кто-нибудь может помочь мне с этим или есть какие-то идеи о том, как я могу двигаться вперед? Большое спасибо заранее, очень ценится.
Вот моя конкретная модель:
class SpecificValue(models.Model):
OPTION1 = 'option1'
OPTION2 = 'option2'
OPTION3 = 'option3'
CHOICES = [
(OPTION1, 'op1'),
(OPTION2, 'op2'),
(OPTION3, 'op3'),
]
building = models.ForeignKey(Building, on_delete=models.CASCADE, null=True,
blank=True, related_name="specific_value")
type = models.CharField(max_length=4, choices=HEAT_COOL_CHOICES)
values_and_keys = JSONField()
timestamp = models.DateTimeField(null=True, blank=True)