'鲜明'条目仅用于使用Django创建sitemap.xml文件(1.5.4)

时间:2015-03-10 22:43:31

标签: python django sitemap

我试图在Django中输出一个sitemap.xml文件,并按照以下方式成功完成。

<url>
<loc>http://example.com/day/AAA</loc>
</url>
<url>
<loc>http://example.com/day/AAA</loc>
</url>
<url>
<loc>http://example.com/day/BBB</loc>
</url>

...等

但是,正如您将从我附加的站点地图文件中看到的那样,我正在尝试仅返回不同的名称&#39;字段作为每个子域的每个添加项,在我的数据库中,这个名称&#39;字段经常重复,但我每次只想在站点地图中使用一次。目前正试图通过Django&#39; .disctint()&#39;似乎返回一个字典列表,所以它应该看起来像:

<loc>http://example.com/day/AAA</loc>
</url>
<url>
<loc>http://example.com/day/BBB</loc>
</url>

...等

但是,它目前正在退回,如:

<url>
<loc>http://example.com/day/AAA</loc>
</url>
<url>
<loc>http://example.com/day/AAA</loc>
</url>
<url>
<loc>http://example.com/day/AAA</loc>
</url>

等...等等,只有第一个名称&#39;每一次......

My Current sitemaps.py文件如下:

from django.contrib import sitemaps
import datetime
from fruit.models import fruitmodel
from django.core.urlresolvers import reverse
from django.db.models import Sum

class fruitSitemap(sitemaps.Sitemap):
    def __init__(self, names):
        self.names = names

    def items(self):
        return fruitmodel.objects.all()


    def location(self, obj):

        dict =  fruitmodel.objects.values_list('name', flat=True).distinct() 
        for i in dict:
                return '/day/%s' % i
        #return '/day/%s' % obj.name """ Current 'working' option, without distinct """

我的模型如下:

class fruitmodel(models.Model):
    name = models.CharField(max_length=128, unique=False)
    likes = models.IntegerField(default=0)
    date = models.DateField()
    veggeorfruit = models.CharField(default="vegetable", max_length=128, unique=False)

    def __unicode__(self):
        return self.name

您需要添加的任何内容都将受到赞赏。非常感谢提前:))

根据要求: 模拟打印声明(printer.py)

from fruit.models import fruitmodel

print( fruitmodels.objects.order_by('name').values_list('name', flat=True).distinct().query)

给出 &#34; django.core.exceptions.ImproperlyConfigured:请求设置DATABASES,但未配置设置。您必须在访问设置之前定义环境变量DJANGO_SETTINGS_MODULE或调用settings.configure()。 &#34;

1 个答案:

答案 0 :(得分:2)

问题在于您的items方法,而不是您的location方法。 items方法是生成站点地图中项目列表的方法,location方法应该返回一个位置,给定一个项目作为其obj参数传递。< / p>

所以试试这个:

def items(self):
    return fruitmodel.objects.distinct('name')

def location(self, obj):
    return '/day/%s' % obj.name

编辑:以上似乎只适用于PostgreSQL(我认为)。对于不支持DISTINCT ON的数据库,您可以尝试:

def items(self):
    return list(set([f.name for f in fruitmodel.objects.all()]))

def location(self, obj):
    return '/day/%s' % obj

但我认为更好的解决方案是将您的模型考虑在内,以使name实际上是唯一的,并将日期作为相关对象。