Многомодельный RSS-канал в Django

#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. Я не пробовал объединяться с запросами, имеющими разные поля, поэтому я не знаю, является ли результатом сообщение об ошибке или другое поведение