Electronics & Programming

develissimo

Open Source electronics development and programming

  • You are not logged in.
  • Root
  • » Django
  • » object appears twice after filtering by many to many field [RSS Feed]

#1 Dec. 22, 2010 09:30:33

t.
Registered: 2009-11-02
Reputation: +  0  -
Profile   Send e-mail  

object appears twice after filtering by many to many field


Hi all!
I have 2 models: Clip, Tag.
class Clip(models.Model):
name = models.CharField(max_length=80)
tags = models.ManyToManyField(Tag, through = 'TagsToClips')

class Tag(models.Model):
tagName = models.CharField(max_length=80, unique=True)

class TagsToClips(models.Model)
clip = models.ForeignKey(Clip)
tag = models.ForeignKey(Tag)
start_frame = models.IntegerField()
duration = models.IntegerField()

--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to
django-users+unsubscr...@googlegroups.com.
For more options, visit this group athttp://groups.google.com/group/django-users?hl=en.

Offline

#2 Dec. 22, 2010 09:41:41

t.
Registered: 2009-11-02
Reputation: +  0  -
Profile   Send e-mail  

object appears twice after filtering by many to many field


Hi all!
I have 2 models: Clip, Tag.
class Clip(models.Model):
name = models.CharField(max_length=80)
tags = models.ManyToManyField(Tag, through = 'TagsToClips')

class Tag(models.Model):
tagName = models.CharField(max_length=80, unique=True)

class TagsToClips(models.Model)
clip = models.ForeignKey(Clip)
tag = models.ForeignKey(Tag)
start_frame = models.IntegerField()
end_frame = models.IntegerField()
class meta:
unique_together = ("clip", "tag",
"start_frame","end_frame")

now, assume I have clip named "clip_1", and tag "adult_scene" with
tag.id = 1
if I tag the the same clip twice with the same tag but different
frames (clip has an adult scene from frame 1 to 10 and also from frame
50 to 70 )
now I wnat all clips with adult scenes - I filter:
clip_set = Clip.objects.filter(tags__id__exact = 1)

I get the clip "clip_1" twice! (clip_set.all() =
)
I tried to filter in different ways, but didn't succeed.
What am I doing wrong?
Thanks,

--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to
django-users+unsubscr...@googlegroups.com.
For more options, visit this group athttp://groups.google.com/group/django-users?hl=en.

Offline

#3 Dec. 22, 2010 09:42:53

Dan F.
Registered: 2009-11-02
Reputation: +  0  -
Profile   Send e-mail  

object appears twice after filtering by many to many field


> Hi all!
> I have 2 models: Clip, Tag.
> class Clip(models.Model):
> name = models.CharField(max_length=80)
> tags = models.ManyToManyField(Tag, through = 'TagsToClips')
>
> class Tag(models.Model):
> tagName = models.CharField(max_length=80, unique=True)
>
> class TagsToClips(models.Model)
> clip = models.ForeignKey(Clip)
> tag = models.ForeignKey(Tag)
> start_frame = models.IntegerField()
> duration = models.IntegerField()

Great! Do you actually have a problem then? ;)

Joking aside, and taking a wild stab at what your problem is without any actual
code, I'd say the underlying JOIN is producing multiple rows, and you probably
need a distinct() call somewhere on your queryset.

Then again, that might not be the problem at all, because you haven't said :)

Cheers,
Dan

--
Dan Fairs | dan.fa...@gmail.com | www.fezconsulting.com


--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to
django-users+unsubscr...@googlegroups.com.
For more options, visit this group athttp://groups.google.com/group/django-users?hl=en.

Offline

#4 Dec. 22, 2010 09:51:55

t.
Registered: 2009-11-02
Reputation: +  0  -
Profile   Send e-mail  

object appears twice after filtering by many to many field


Thanks for the quick replay.
The problem is the clip duplication, when relaying on clip_set.count()
and also in the admin site when you see raw duplication after
filtering , it is not very reasonable :)

1. in order to change this behavior in the admin site I need to
manipulate main.py and add distinct() somewhere?
2. I read everywhere that distinct() works really slow and you better
avoid using it.

what do you say?

Thanks again,

On Dec 22, 11:42 am, Dan Fairs <dan.fa...@gmail.com> wrote:
> > Hi all!
> > I have 2 models: Clip, Tag.
> > class Clip(models.Model):
> >          name = models.CharField(max_length=80)
> >          tags = models.ManyToManyField(Tag, through = 'TagsToClips')
>
> > class Tag(models.Model):
> >          tagName = models.CharField(max_length=80, unique=True)
>
> > class TagsToClips(models.Model)
> >          clip = models.ForeignKey(Clip)
> >          tag = models.ForeignKey(Tag)
> >          start_frame = models.IntegerField()
> >    duration = models.IntegerField()
>
> Great! Do you actually have a problem then? ;)
>
> Joking aside, and taking a wild stab at what your problem is without any
> actual code, I'd say the underlying JOIN is producing multiple rows, and you
> probably need a distinct() call somewhere on your queryset.
>
> Then again, that might not be the problem at all, because you haven't said :)
>
> Cheers,
> Dan
>
> --
> Dan Fairs | dan.fa...@gmail.com |www.fezconsulting.com

--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to
django-users+unsubscr...@googlegroups.com.
For more options, visit this group athttp://groups.google.com/group/django-users?hl=en.

Offline

#5 Dec. 22, 2010 10:00:32

Dan F.
Registered: 2009-11-02
Reputation: +  0  -
Profile   Send e-mail  

object appears twice after filtering by many to many field


> Thanks for the quick replay.
> The problem is the clip duplication, when relaying on clip_set.count()
> and also in the admin site when you see raw duplication after
> filtering , it is not very reasonable :)
>

Ah, I didn't realise it was in the admin.

It'll still be the same underlying problem - the intermediate JOIN table
producing too many rows. If you want to 'fix' that, I suspect you'll need to
write a custom manager for your Clip model, give it a get_query_set() method
that calls the superclass method with .distinct() on the end.

> 1. in order to change this behavior in the admin site I need to
> manipulate main.py and add distinct() somewhere?

Read up on custom managers and the default manager.

> 2. I read everywhere that distinct() works really slow and you better
> avoid using it.
>
> what do you say?

Things are not 'slow' or 'fast' in isolation. They are either 'too slow', or
'fast enough'. Try it, it may be fast enough for you. If it's not, you'll need
to find a faster solution. In particular, if the resultant filtered set is
relatively small, then I doubt you'll notice the difference.

Cheers,
Dan

--
Dan Fairs | dan.fa...@gmail.com | www.fezconsulting.com


--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to
django-users+unsubscr...@googlegroups.com.
For more options, visit this group athttp://groups.google.com/group/django-users?hl=en.

Offline

  • Root
  • » Django
  • » object appears twice after filtering by many to many field [RSS Feed]

Board footer

Moderator control

Enjoy the 23rd of October
PoweredBy

The Forums are managed by develissimo stuff members, if you find any issues or misplaced content please help us to fix it. Thank you! Tell us via Contact Options
Leave a Message
Welcome to Develissimo Live Support