在 Django 1.5 中建模多个字段查找

Posted

技术标签:

【中文标题】在 Django 1.5 中建模多个字段查找【英文标题】:Model multiple field-lookup in Django 1.5 【发布时间】:2013-04-13 21:07:41 【问题描述】:

我有模特

class ModelName(models.Model):
    type = models.ForeignKey(AnotherModel)
    slug = models.SlugField(editable=False)

    class Meta:
        unique_together = (('type', 'slug'),)

    @models.permalink
    def get_absolute_url(self):
        return ('model_detail', (), 'type': self.type.slug, 'slug': self.slug)

和网址

urlpatterns = patterns('',
    url(r'^(?P<type>[-\w]+)/(?P<slug>[-\w]+)/$', ModelDetailView.as_view(), name='detail'),
)

还有一个详细视图

class ModelDetailView(DetailView):
    model = MyModel
    template_name = 'detail.html'

但我得到异常 MultipleObjectsReturned 因为 slug 不是唯一的。我希望 url 为 /type/slug/,因此模型可以包含两个具有相同 slug 但类型不同的记录,因此 url 可以是 /1/slug//2/slug/ 具有不同的结果。如何告诉模型同时使用类型和 slug 作为查找,而不仅仅是 slug?

【问题讨论】:

【参考方案1】:

您不必“告诉模型”使用类型和字符串字段——这是您必须覆盖的基于类的视图。

我建议您重写get_queryset 方法,以将查询集限制为正确类型的对象。另一种方法是覆盖get_object 方法。

class ModelDetailView(DetailView):
    model = MyModel
    template_name = 'detail.html'

    def get_queryset(self):
        """
        Restrict queryset to objects of the correct type
        """
        return MyModel.objects.filter(type_id=self.kwargs['type'])

有关详细信息,请参阅dynamic filtering 上的 Django 文档。

【讨论】:

以上是关于在 Django 1.5 中建模多个字段查找的主要内容,如果未能解决你的问题,请参考以下文章

如何让 django 中的 Q 查找查找多个值

在 Django 中,如何使用动态字段查找过滤 QuerySet?

Django:按文本字段的长度查找

确定在特定 django 字段管理员中查找哪些字段(select2)

Django Q AND 查找 - 在复杂查找中查询多个条目

使用可变数量的参数过滤多个 Django 模型字段