#python #django #rss
#питон #джанго #RSS-канал
Вопрос:
Я пытаюсь понять, как создать многомодельный RSS-канал в Django. То есть я хотел бы, чтобы Django предоставлял обновления двух разных моделей под одним URL-адресом RSS.
Вот что у меня есть на данный момент
class ArticleFeed(Feed): title = "Articles" link = "/articles/" description = "RSS feed of Articles" def items(self): return Article.objects.filter(is_published=1) def item_title(self, item): return item.title def item_description(self, item): return item.get_description() def item_link(self, item): return item.get_absolute_url() class VideoFeed(Feed): pass class atomFeed(Feed): feed_type = Atom1Feed
В urls.py У меня есть следующий путь
path('rss/', ArticleFeed(), name="article_feed"),
Я хотел rss/
бы предоставить обновления как для статьи, так и для видеомодели. Видеомодель имеет аналогичные поля, но не является дословной.
Ответ №1:
вы можете использовать queryset3 = queryset1.union(queryset2) для объединения элементов двух разных моделей и использовать это в feed.items(самостоятельно):
def items(self): query1 = Article1.objects.filter(is_published=1) query2 = Article2.objects.filter(is_published=1) query = query1.union(query2) # do any sorting AFTER union query_sorted = query.order_by('a_field', 'another_field') self.item_count = query_sorted.count() return query_sorted
union() работает до тех пор, пока запросы содержат одни и те же поля.
Если у вас разные имена полей, но одинаковое содержимое, например «имя» и «имя_элемента», вы можете переименовать поле в одном из запросов:
query2 = Article2.objects.filter(is_published=1).annotate(name=F('item_name')).values('name')
примечание: выше приведен «псевдо» код — я его не запускал, поэтому в нем могут быть синтаксические ошибки
Комментарии:
1. Что делать, если в запросах разные точные поля? Они одинаковы по значению, но не по названию.
2. с помощью .values («a_field», «another_field») вы можете выбрать поля, включенные в запрос, чтобы они были одинаковыми. Так как вам нужны только поля, необходимые для создания ленты (например, имя или URL mp3-файла ..). Если поля имеют одинаковое содержимое, но в модели называются по-разному, вы можете использовать .annotate(field_name=F(‘org_field_name’)) для их переименования. Я отредактировал ответ выше
3. Я не пробовал объединяться с запросами, имеющими разные поля, поэтому я не знаю, является ли результатом сообщение об ошибке или другое поведение