Я работаю в проекте django, который мне нужно перечислить двумя разными моделями в одном представлении, упорядоченным по дате. Чтобы достичь этого, я использовал наследование, чтобы иметь возможность получить их в общий набор запросов. Мои модели:Как заставить запросы на суперклассу возвращать объекты подкласса? Или отклонить запрос запроса суперкласса к списку подкласса?
class Publication(models.model):
title = models.CharField(max_lengh = 200)
pub_date = models.DateTimeField(default = datetime.now)
headline = models.TextField()
class Meta:
abstract = True
@abc.abstractmethod
def say_hello(self):
return
class New(Publication):
author = models.ForeignKey(Author)
source = models.CharField(max_length = 200)
categories = models.ManyToManyField(Category)
url = '/news/'
def say_hello(self):
return "Hello New!!!"
class Opinion(Publication):
writer = models.ForeignKey(Writer)
style = .models.CharField(max_length=3, choices=(('txt', 'Text'), ('glr', 'Galery')))
url = '/opinions/'
def say_hello(self):
return "Hello Opinion!!!"
Я пытаюсь вызвать метод подкласса, а перебор в публикации QuerySet, как это:
publications = Publications.objects.all().order_by('-pub_date')
for pub in publications:
pub.say_hello()
url = pub.url
Проблема в том, что мой QuerySet возвращаются объектами издания, так что я могу 't доступ к дочерним атрибутам и методам, очевидно, что я имею дело с объектами Publication. Должен не быть Тот факт, что я установил публикацию как абстрактный класс, избегайте возможности иметь дело с объектами Publication ?. Не следует ли им не создавать экземпляр? Есть ли возможность выполнить класс QuerySet в классе Publication и вернуть список с дочерними объектами?
Если нет. Как вы, ребята, обходите эту ситуацию? Я мог бы использовать несколько советов.
Полиморфизм Django кажется отличным. Проблема в том, что у меня уже есть база данных. Я попытался выполнить южную миграцию, но polymorphic_ctype_id - NULL. Есть ли трюк для применения django-polymorphic в уже существующем населенном db? – Mauricio
Ну, я никогда не делал этого раньше, но я уверен, что это можно сделать. Я не могу дать никакого большого совета, но я бы предложил начать с создания тестового приложения с полиморфными моделями, переноса базы данных и проверки того, как полиморфные структуры строят свои таблицы. Большая часть работы, вероятно, будет связана с обновлением любых моделей, относящихся к вашим двум старым моделям, поскольку значения столбцов идентификатора должны будут измениться. –
Это сработало! Модуль django-polymorphic добавляет поле polymorphic_ctype к модели, которая ссылается на экземпляр из django.contrib.contenttypes.models импортирует ContentType. Я просто сделал это, потому что все мои дочерние модели добавили его объект contentType и сохранили его. – Mauricio