我们有大量的产品。约5000万件商品 在 Django 中生成站点地图的最佳方法是什么?
目前我们通过以下方式生成它们:
站点地图.py
class BookSitemap1(Sitemap):
protocol = 'https'
changefreq = 'weekly'
priority = 0.9
def items(self):
return Book.objects.all().order_by('id')[0:25000]
class BookSitemap2(Sitemap):
protocol = 'https'
changefreq = 'weekly'
priority = 0.9
def items(self):
return Book.objects.all().order_by('id')[25000:50000]
...
Urls.py
sitemap_books_1 = {'books1': BookSitemap1}
sitemap_books_2 = {'books2': BookSitemap2}
...
path('books-1.xml', sitemap, {'sitemaps': sitemap_books_1}, name='django.contrib.sitemaps.views.sitemap'),
path('books-2.xml', sitemap, {'sitemaps': sitemap_books_2}, name='django.contrib.sitemaps.views.sitemap'),
...
我们所有的 5000 万种产品等等。但这是 2000 个站点地图...我们可以在每个站点地图中放置 50000 个 ulr。但这又会是 1000 个站点地图
还有其他解决方案可以在 Django 中生成站点地图吗?因为这个解决方案对我来说非常不方便
如果您将 items() 作为查询集返回,Django 将为您处理分页。
class BookSitemap(Sitemap):
protocol = 'https'
changefreq = 'weekly'
priority = 0.9
def items(self):
return Book.objects.all().order_by('id')
然后让 Django sitemaps.views.index 处理你的索引:
path('sitemap.xml', index, {'sitemaps': {'books': BookSitemap}}),
path('sitemap-<section>.xml', sitemap, {'sitemaps': {'books': BookSitemap}}, name='django.contrib.sitemaps.views.sitemap')
@Thiago Mattos 关于使用站点地图索引的回答是正确的。
但是为了提高内存效率,我宁愿去掉
Book.objects.all()
并使用 .values_list("id_or_necessary_field")
来代替。
因为
Sitemap
在后台使用分页器,并且无论如何都会迭代您插入的整个 objects_list
,在您的情况下它是 Queryset
,它可能非常大。