3

Я ищу несколько советов о том, как выполнить запрос с несколькими объектами, а затем использовать их вместе в подробном представлении для связанного с ним объекта. Вот то, что я работаю с прямо сейчас:Запрос нескольких моделей Django

-- app/models.py -- 

class Material(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    title = models.CharField(max_length=50) 
    slug = models.SlugField() 
    description = models.TextField() 

    def __str__(self): 
    return self.title 

class Category(Material): 
    parent = models.ForeignKey('self', related_name='children') 

class Content(Material): 
    author = models.ForeignKey(User) 
    category = models.ForeignKey(Category) 

class SomeObject(Content): 
    # Model specific properties and methods 

class SomeOtherObject(Content): 
    # Model specific properties and methods 

То, что я пытаюсь сделать, чтобы отобразить как SomeObject и SomeOtherObject вместе в представлении Категория подробно. Каждая из этих моделей будет иметь различные атрибуты, которые делают их уникальными друг для друга. Это ситуация, когда полезны общие внешние ключи ?

-- app/templates/category_detail.html -- 

{% block content %} 
    <header class="category-header"> 
    <h1 class="category-title">{{ category.title }}</h1> 
    </header><!-- .category-header --> 

    <section class="category-items"> 
    {% for item in category.manager_that_queries_both.all %} 
     # Display each item differently depending on the type 
    {% empty %} 
     "Oops, we couldn't find anything for this category!" 
    {% endfor %} 
    </section><!-- .category-items --> 
{% endblock %} 

Я хотел бы остаться в стороне от писак, которые собираются быть трудно поддерживать в течение всей жизни этого продукта, если это возможно. Еще раз спасибо за помощь ребята =)

ответ

2

Для manager_that_queries_both.all Вы можете использовать Django Model Utils.

В частности, Inheritance Manager.

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

Material.objects.select_subclasses() 

Чтобы сделать что-то в шаблонах в зависимости от типа объекта, который вы могли бы реализовать фильтр описанного here.

+0

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

+0

Я добавил ссылку на фильтр, который позволяет работать с именем класса (без добавления методов к вашим моделям) –

1
class SomeObject(Content): 
    # model_specific_arttributes 
    is_some_object = True 

class SomeOtherObject(Content): 
    is_some_object = False 

Теперь вы можете использовать if заявления в шаблоне, чтобы различать два типа объекта и использовать различные шаблоны для их отображения.

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