Как сделать сложный запрос с помощью json_field - PullRequest
0 голосов
/ 31 октября 2019

В моем приложении 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...