Programming/Django

[Dajngo] Many to Many 검색 방법

stein 2022. 1. 18. 16:43

https://stackoverflow.com/questions/2218327/django-manytomany-filter

 

Django ManyToMany filter()

I have a model: class Zone(models.Model): name = models.CharField(max_length=128) users = models.ManyToManyField(User, related_name='zones', null=True, blank=True) And I need to contruct a

stackoverflow.com

 

users_in_1zone = User.objects.filter(zones=<id1>)

# same thing but using in
users_in_1zone = User.objects.filter(zones__in=[<id1>])

# filtering on a few zones, by id
users_in_zones = User.objects.filter(zones__in=[<id1>, <id2>, <id3>])

# and by zone object (object gets converted to pk under the covers)
users_in_zones = User.objects.filter(zones__in=[zone1, zone2, zone3])

올바른 사용법

 

예)

models.Post.objects.filter(categories__in=[models.Category.objects.get(name='Vue')])

models.Post.objects.filter(categories__in=models.Category.objects.filter(name='Vue'))

 

결과)

<QuerySet [<Post: nuxtjs/auth-next 설치>, <Post: [vuetify] v-rating\Custom Icon 사용하기>]>

 

잘못된 사용법

 

예)

models.Post.objects.filter(categories__in=models.Category.objects.filter(name='Vue').values_list())
models.Post.objects.filter(categories__in=models.Category.objects.filter(name='Vue').values())

 

결과)

<django.db.models.query.QuerySet object at 0xffff74335d60>

<django.db.models.query.QuerySet object at 0xffff742978b0>

 

 


헷갈리는 이유

 

filter의 반환 형태는 다음과 같다

 

models.Category.objects.filter(name='Vue')
<QuerySet [<Category: Vue>]>

 

models.Category.objects.filter(name='Vue')[0]
<Category: Vue>

 

models.Category.objects.filter(name='Vue').values()
<QuerySet [{'id': 3, 'name': 'Vue', 'type': 'sub', 'parent_id': 2}]>

 

즉 filter가 받아들이는 argument는 model을 리스트로 가지고 있는 queryset과(filter의 return), model object이다. 하지만 filter의 value로 나온 list로 감싸진 dict를 의미하는 queryset을 arguement로 전달하면 검색이 되지 않는다.

 

왜 이렇게 해놨을까..?

 

아래는 django doc의 filter 정의. 

filter()

filter(*args, **kwargs)

Returns a new QuerySet containing objects that match the given lookup parameters.

The lookup parameters (**kwargs) should be in the format described in Field lookups below. Multiple parameters are joined via AND in the underlying SQL statement.

If you need to execute more complex queries (for example, queries with OR statements), you can use Q objects (*args).

 

 


 

아직도 모르는 개념이 참 많다. 공부하자