Как получить Django моделей объектов / запросов в виде словаря в случае нескольких уровней взаимосвязи? - PullRequest
0 голосов
/ 28 мая 2020

У меня 3 модели:

class Country(models.Model):
    country_id = models.AutoField(primary_key=True)
    country_name = models.CharField(max_length=50)
    population = models.BigIntegerField()

class State(models.Model):
    state_id = models.AutoField(primary_key=True)
    state_name = models.CharField(max_length=50)
    country = models.ForeignKey(Country, on_delete=models.CASCADE)
    population = models.BigIntegerField()

class District(models.Model):
    state_id = models.AutoField(primary_key=True)
    district_name = models.CharField(max_length=50)
    state = models.ForeignKey(State, on_delete=models.CASCADE)
    population = models.BigIntegerField()

Теперь, учитывая country_id, я хочу получить все связанные State и District в следующем формате:

{
    'country':{
        'country_id': 1,
        'coutry_population': 120000,
        'state':[
            {
            'state_id': 10,
            'state_name': 'A',
            'state_population': 10000,
            'district':[
                {
                    'district_id': 100,
                    'district_name': 'District1',
                    'district_population': 4000
                },
                {
                    'district_id': 101,
                    'district_name': 'District2',
                    'district_population': 6000
                }]
            },
            {
                <2nd state data here>
            }
        ]
    }
}

Также я должен иметь возможность выбирать определенные столбцы из каждой модели.

Например: только state_name из State модели, district_name и district_population из District модели, et c

Мне тоже нужна функция фильтрации, на разных моделях.

Например: Получите только районы, соответствующие условию District.population> 5000

Ни один из вопросов, которые я мог здесь найти, не помог решить проблему. Ближайший из них выглядел так: Django: наиболее эффективный способ создания вложенного словаря из запросов связанных моделей?

Но здесь связь находится в противоположном направлении.

Одно из решений, которое я мог придумать, заключалось в том, чтобы запросить каждую из моделей по-разному и сохранить их в словаре, а затем объединить. Но если бы я мог получить более прямой подход, это было бы полезно.

1 Ответ

0 голосов
/ 28 мая 2020

Нет необходимости вручную склеивать словарь с нужными данными.

Вы можете запросить объект страны и получить связанные районы через соответствующий менеджер.

my_country = Country.objects.get(1)
all_districts = my_country.district_set.all()

Или отфильтрованные районы:

filtered_districts = my_country.district_set.filter(district_name='...')

Вы также можете установить related_name в классе Model, например:

class State(models.Model):
    state_id = models.AutoField(primary_key=True)
    state_name = models.CharField(max_length=50)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, related_name = 'states')
    population = models.BigIntegerField()

Затем вы можете запросить связанные состояния с помощью:

large_states_of_my_country = my_country.states.filter(population_gte = 50000)

См.:

...