Django sitemap.xml 适用于数百万产品

问题描述 投票:0回答:2

我们有大量的产品。约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 中生成站点地图吗?因为这个解决方案对我来说非常不方便

python django sitemap
2个回答
1
投票

如果您将 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')

相关:Ping google 关于分页站点地图 django


0
投票

@Thiago Mattos 关于使用站点地图索引的回答是正确的。

但是为了提高内存效率,我宁愿去掉

Book.objects.all()
并使用
.values_list("id_or_necessary_field")
来代替。

因为

Sitemap
在后台使用分页器,并且无论如何都会迭代您插入的整个
objects_list
,在您的情况下它是
Queryset
,它可能非常大。

© www.soinside.com 2019 - 2024. All rights reserved.