如何跨越多值关系?

How To Spanning multi-valued relationships?

我尝试从 table 名称为“UserUsulan”的数据库中捕获任何数据。 我有两个字段,“Ketua”和“Anggota”。 Ketua Field 是来自 User 的 ForeignKey,而 Anggota 是 ManyToMany Field with relationship from User.

我要渲染数据。 如果在 Ketua 字段等于 current.user 渲染数据。 如果 Anggota 字段中的 current.user 我也希望它渲染。

所以, 如果current.user不能在Ketua场,但可以在Anggota场。渲染数据 如果current.user不能在Anggota Field,可以在Ketua Field。也渲染数据。

如何解决这个问题。 我阅读了这份文档 Spanning multi-valued relationships 。但是查询集是空的[].

models.py

    tahun                       = models.IntegerField(_('year'), choices=YEAR_CHOICES, default=datetime.datetime.now().year)
judul_penelitian            = models.TextField(blank=True)
jenis_penelitian            = models.CharField(max_length=16, blank=True, default="", choices=JENIS_PENELITIAN_CHOICE)
tmt_awal                    = models.DateField(null=True, blank=True)
tmt_akhir                   = models.DateField(null=True, blank=True)
bidang_penelitian           = models.CharField(max_length=10, blank=True, default="", choices=BIDANG_PENELITIAN_CHOICE)
tujuan_sosial_ekonomi       = models.TextField(blank=True)
sumber_dana                 = models.CharField(max_length=30, blank=True, default="", choices=SUMBER_DANA_CHOICE)
skema_penelitian            = models.CharField(max_length=15, blank=True, default="", choices=SKEMA_PENELITIAN_CHOICE)
jumlah_dana_usulan          = MoneyField(max_digits=14, decimal_places=2, default_currency='IDR')
target_luaran               = models.CharField(max_length=23, blank=True, default="", choices=TARGET_LUARAN_CHOICE)
ketua                       = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='ketua_penelitian', on_delete=models.CASCADE, null=True, blank=True)
anggota                     = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='anggota_penelitian')
upload_file                 = models.FileField(upload_to='Penelitian/', null=True, blank=True)
status_usulan               = models.CharField(max_length=8, blank=True, choices=STATUS_USULAN_CHOICE, default='MENUNGGU')
jumlah_dana_disetujui       = MoneyField(max_digits=14, decimal_places=2, default_currency='IDR', null=True, blank=True)
keterangan_operator         = models.TextField(null=True, blank=True)
com_reviewer_1              = models.TextField(null=True, blank=True)
com_reviewer_2              = models.TextField(null=True, blank=True)

views.py

def get_queryset(self):
    queryset    = super(UserUsulanPenelitianCreateAndListView, self).get_queryset()
    queryset    = queryset.filter(ketua=self.request.user,).filter(anggota=self.request.user,)
    print(queryset)
    return queryset

我找到了答案,使用 Q 作为查询集

导入Q

from django.db.models import Q

在查询集中使用 Q

def get_queryset(self):
    queryset    = super(UserUsulanPenelitianCreateAndListView, self).get_queryset()
    queryset    = queryset.filter(Q(ketua=self.request.user)|Q(anggota=self.request.user)).distinct()
    print(queryset)
    return queryset