Opened 5 years ago

Closed 5 years ago

#13423 closed (invalid)

Subquerying using models

Reported by: jprafael@… Owned by: nobody
Component: Database layer (models, ORM) Version: 1.1
Severity: Keywords: models subquery
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:

Description

Using this models

class UserProfile(models.Model):
    data 	= models.ManyToManyField('self', through='DataPerms', symmetrical=False)
    ....

class DataPerms (models.Model):
    user = models.ForeignKey(UserProfile)
    data = models.ForeignKey(Data)

    edit = models.BooleanField()
    view = models.BooleanField()
    ....

class Data (models.Model):
    text = models.TextField(max_lenght=50)

One should be allowed to view all data a user can view. To do this i am currently doing something like

Data.objects.in_bulk(list(DataPerms.objects.filter(user = request.user, edit = True).values_list('data', flat=True))).values()

i think it should be a straight forward implementation to allow to fetch object fields from a QuerySet without having to iterate trough all. something like values() but that resolves PKs into objects and returns another QuerySet.

DataPerms.objects.filter(user = request.user, edit = True).field('data').all()

Should translate to

SELECT * FROM data WHERE id in (SELECT id FROM dataperms WHERE user = 'userid' && edit = 1)

Change History (2)

comment:1 Changed 5 years ago by anonymous

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

data = models.ManyToManyField('self', through='DataPerms', symmetrical=False)
should be
data = models.ManyToManyField(Data, through='DataPerms', symmetrical=False)

comment:2 Changed 5 years ago by russellm

  • Resolution set to invalid
  • Status changed from new to closed

This is already possible using pkin:

Data.objects.filter(pk__in=DataPerms.objects.filter(user=request.user, edit=True).values('data'))
Note: See TracTickets for help on using tickets.
Back to Top