How To Spanning multi-valued relationships?

Viewed 56

Im Try to Catch any data from database with table name is 'UserUsulan'. I have two field, 'Ketua' and 'Anggota'. In Ketua Field is ForeignKey from User, and Anggota is ManyToMany Field with relationship from User.

I want to render the data. if in Ketua Field equal current.user render the data. and also if current.user in Anggota field i want it render too.

So, If the current.user is not able in Ketua Field, but able in Anggota Field. Render the Data If the current.user is not able in Anggota Field, buat able in Ketua Field. Render the Data Too.

How To Solve this problem. Im read with this documentation Spanning multi-valued relationships . But the Queryset is empty[].

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
1 Answers

I Found The Answer, Using Q for the queryset

Import Q

from django.db.models import Q

Using Q in Queryset

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
Related