2014-10-22 2 views
0

В моем приложении много моделей, которые могут иметь 0 или более переводов. Я решил поставить перевод в отдельно таблицах:Django запросы и переводимые модели

MyModel() 
    reference = text 
    is_deleted = boolean 
    updated_on = datetime 


MyModelTrans() 
    parent = MyModel 
    name = text 

Обратите внимание, что API реализует softdelete через is_deleted и дополнительных обновлений через updated_on (немного упрощена здесь).

Мой вопрос: есть ли способ получить весь набор данных в одном единственном запросе с помощью Django ORM? Я хочу, чтобы все экземпляры MyModel были возвращены вместе с их (необязательными) переводами.

Сначала я хотел выполнить это, просто запросив таблицу MyModelTrans() с помощью select_related на «parent», но потом понял, что не все MyModels будут иметь переводы.

Благодарим вас за ввод.

ответ

0

Вы должны использовать prefetch_related. Он используется для эффективного выбора соответствующих моделей вместе с моделями. Подробнее см. Здесь. https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related

Например, вы можете написать следующее.

MyModel.objects.all().prefetch_related("translations") 

Вам нужно будет установить related_name в вашем определении ForeignKey для MyModelTrans.

parent = ForeignKey(MyModel, related_name="translations") 

Один запрос будет выполнен для выбора экземпляров модели, а другой запрос будет выполнен для выбора связанных полей.

+0

Спасибо за ваш ответ. Я уже знал, что вы предлагаете, и я указываю это в своем посте. Мой вопрос - какой запрос мы ищем для поддержки основных объектов, которые НЕ МОГУТ иметь никаких переводов. – tdma

Смежные вопросы