首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Django管理中限制ManyToMany MultipleSelect的查询集

在Django管理中限制ManyToMany MultipleSelect的查询集
EN

Stack Overflow用户
提问于 2013-05-22 04:50:41
回答 2查看 10.3K关注 0票数 10

我有一个模型,看起来像这样:

代码语言:javascript
运行
复制
class Event(models.Model):
    event_dates = ManyToManyField("EventDate")
    #...

class EventDate(models.Model):
    event_date = DateField()
    #...

但是,在EventAdmin中为event_dates显示的django admin MultipleSelect表单字段中,我想将查询集限制为不是过去的event_dates。

查询集应该类似于:

代码语言:javascript
运行
复制
event_date_queryset = EventDate.objects.filter(event_date__gte = datetime.date.today()) 

但是,我可以在哪里设置这个查询集,以便只在字段中显示非过去的日期?

(我目前还没有针对EventAdmin的自定义表单,但我很乐意添加一个。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-22 14:42:28

您可以尝试:

代码语言:javascript
运行
复制
event_dates = models.ManyToManyField("EventDate", limit_choices_to={'event_date__gte': date.today()})

摘自https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.limit_choices_to

但是,即使过去的一些日期仍然与Event关联,也只显示未来的日期。

如果您还想要以前与Event关联的所有日期,可以按如下方式操作ModelForm

代码语言:javascript
运行
复制
from datetime import date

from django.contrib import admin
from django import forms
from django.db.models import Q

from models import Event, EventDate

class EventAdminForm(forms.ModelForm):
    class Meta:
        model = Event

    def __init__(self, *args, **kwargs):
        super(EventAdminForm, self).__init__(*args, **kwargs)
        if 'event_dates' in self.initial:
            self.fields['event_dates'].queryset = EventDate.objects.filter(Q(pk__in=self.initial['event_dates']) | Q(event_date__gte=date.today()))
        else:
            self.fields['event_dates'].queryset = EventDate.objects.filter(event_date__gte=date.today())

class EventAdmin(admin.ModelAdmin):
    form = EventAdminForm
    filter_horizontal = ['event_dates']
票数 26
EN

Stack Overflow用户

发布于 2016-04-13 23:43:39

最简单的方法是在管理员中执行此操作

你的模型

代码语言:javascript
运行
复制
class Event(models.Model):
    event_dates = ManyToManyField("EventDate")
    #...

class EventDate(models.Model):
    event_date = DateField()
    #...

现在在您的管理文件中

这还有一个额外的优点,即它只返回使用反向查找event__id=event_id查看的当前事件的事件日期

代码语言:javascript
运行
复制
class EventAdmin(admin.ModelAdmin):
    def get_field_queryset(self, db, db_field, request):
        """
        If the ModelAdmin specifies ordering, the queryset should respect that
        ordering.  Otherwise don't specify the queryset, let the field decide
        (returns None in that case).
        """
        if db_field.name == 'event_dates':
            event_id = int(request.resolver_match.args[0])

            return db_field.remote_field.model._default_manager.filter(
                              event__id=event_id,
                              event_date__gte = datetime.date.today()
            )

        super().get_field_queryset(db, db_field, request)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16679269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档