Джанго - выпуск ForeignKey.Сколько обращений к БД? - PullRequest
2 голосов
/ 13 июля 2011

Я сейчас использую Django, и моя модель похожа на эту.

class City(models.Model):
    name = models.CharField(max_length=255, primary_key=True)
    url = models.URLField()

class Paper(models.Model):
    city = models.ForeignKey(City)
    name = models.CharField(max_length=255)
    price = models.IntegerField()

class Article(models.Model):
    paper = models.ForeignKey(Paper)
    name = models.CharField(max_length=255)

Я пытаюсь получить объект "Город", несколько объектов "Бумага" и несколько объектов "Статья" путем фильтрации по названию города и цене бумаги.

Для поиска по таблице City я могу сделать это:

    cities = City.objects.get(pk='Toronto')

Чтобы получить объекты Paper:

    papers = Paper.objects.filter(city=cities, price < 5)

или я мог бы даже объединить два:

    papers = cities.paper_set.filter(city=cities, price < 5)

(Будет ли это эффективнее?)

Проблема в том, чтобы найти эффективный способ получить все статьи из вышеприведенных «статей».

Я не могу использовать paper.article_set, так как paper - это QuerySet. И если я попытаюсь использовать цикл, он, вероятно, будет делать запросы один раз для каждого бумажного объекта, верно?

Для справки: таблица City содержит 1000 столбцов, в каждом городе 1-1000 объектов Paper и около 10 объектов Article на каждый объект Paper.

Любая помощь будет по достоинству оценена.

Спасибо.

Edit: Если у меня есть QuerySet для городов (см. Выше), есть ли способ получить все объекты Article в одном запросе?

Ответы [ 3 ]

1 голос
/ 13 июля 2011

Я не могу использовать paper.article_set, так как документы - это QuerySet.И если я попытаюсь использовать цикл, он, вероятно, будет делать запросы один раз для каждого бумажного объекта, верно?

Если вы зацикливаете набор запросов, выполняется только одна инструкция SQL.Django кэширует весь набор запросов, но если у вас есть только 1000 строк, это не составит проблемы.

Если вы перебираете большие наборы запросов, используйте queryset.iterator ():

https://docs.djangoproject.com/en/1.3/topics/db/optimization/

1 голос
/ 13 июля 2011

Вы можете получить выполненные запросы следующим образом (убедитесь, что DEBUG = True в вашем settings.py):

 from django.db import connection
 connection.queries

Более подробную информацию можно найти в Django DB FAQ .

0 голосов
/ 13 июля 2011
articles = Article.objects.all(paper__city__name='Toronto', paper__price__lt=5)
...