【问题标题】:Django Combining Multiple Filters for ManytoMany ChoiceDjango为多对多选择组合多个过滤器
【发布时间】:2020-10-05 14:21:58
【问题描述】:

我正在尝试过滤 Django 表单中的 ManyToMany 字段,以便它只包含与登录用户(父母和孩子)关联的当前用户登录用户的选择

forms.py

class LessonsForm(forms.ModelForm):
class Meta:
    model = models.Lessons
    fields = ['type_of_lesson','attendees','max_capacity','teacher','date_of_lesson','time_of_lesson']

class LessonAddForm(forms.ModelForm):
def __init__(self, user, *args, **kwargs):
    super(LessonAddForm, self).__init__(*args, **kwargs)
    self.fields['attendees'].queryset = CustomUser.objects.filter(username=user)


class Meta:
    model = models.Lessons
    fields = ['attendees']

模型.py

class CustomUser(AbstractUser):
date_of_birth = models.DateField()
is_parent = models.BooleanField(verbose_name="Parent")
children = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True)
REQUIRED_FIELDS = ['date_of_birth', 'is_parent','email',]

class Lessons(models.Model):
type_of_lesson = models.CharField("Lesson Type", max_length=128)
attendees = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name="attendee_users")
max_capacity = models.IntegerField()
teacher = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name="teaching_user",limit_choices_to={'is_staff': True})
date_of_lesson = models.DateField()
time_of_lesson = models.TimeField()
date_added = models.DateField(auto_now_add = True)

下面的行是我苦苦挣扎的地方,这会带回当前用户,但我也试图让“孩子”连接到用户也出现在与会者的选择中。

self.fields['attendees'].queryset = CustomUser.objects.filter(username=user)

我尝试了一些方法,下面是一个示例,但我似乎无法弄清楚如何组合两个过滤器

    self.fields['attendees'].queryset = CustomUser.objects.filter(username=user,user.children)

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您可以使用Q objects [Django-doc] 过滤并使用逻辑

    from django.db.models import Q
    
    self.fields['attendees'].queryset = CustomUser.objects.filter(
        Q(username=user) |
        Q(customuser__username=user)
    )

    customuser__ 部分正在查询 reverse 中的children 关系。所以我们正在寻找CustomUsers,它的父级具有username,给定的user

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 2018-06-16
      • 2016-06-19
      • 1970-01-01
      • 2022-01-01
      • 2020-03-20
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      相关资源
      最近更新 更多