я создавать приложения, где пользователи могут оставлять свои Относящиеся теги:фильтр в ContentType со списком поле объекта контента в
class Tag(models.Model):
name = models.CharField(max_length=255, unique=True)
class Post(models.Model):
user = models.ForeignKey(User)
body = models.TextField()
tags = models.ManyToManyField(Tag)
pub_date = models.DateTimeField(default=timezone.now)
activity = GenericRelation(Activity, related_query_name="posts")
class Photo(models.Model):
user = models.ForeignKey(User)
file = models.ImageField()
tags = models.ManyToManyField(Tag)
pub_date = models.DateTimeField(default=timezone.now)
activity = GenericRelation(Activity, related_query_name="photos")
class Activity(models.Model):
actor = models.ForeignKey(User)
verb = models.PositiveIntegerField(choices=VERB_TYPE)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
pub_date = models.DateTimeField(default=timezone.now)
То, что я хочу сделать, это получить максимум/фильтр 5 последних/последних объектов активность, со списком пользователей и списком тегов из списка полей тегов Post objects и return json, используя django-rest-framework для просмотра на стороне клиента.
Eg деятельности:
- UserA создан новый пост obect с тегами (#class, #school)
- UserB создан новый пост объект с тегами (#professor, #teacher)
- UserC создал новый объект Post с тегами (#school, #university)
- UserD создал новый объект Post с тегами (#university, #school)
Так, я хочу, чтобы фильтровать активность с user_list=[UserA, UserC]
и tag_list = [#class, #teacher]
Она должна возвращать:
- UserA создано новое сообщение obect с тегами (#class, #school)
- UserC создали новый объект Post с теги (#school, #university)
- UserB создал новый объект Post с тегами (#professor, #teacher)
Чтобы отфильтровать активность с пользователями, я могу запросить т его путь:
Activity.objects.filter(actor__in=user_list)
Но, как я фильтровать активность с (i.e.Post или Фото) поле content_object в (т.е. Post.tags или Photo.tags)? Теперь я делаю так:
Activity.objects.filter(posts__tags__in=tag_l)
Activity.objects.filter(photos__tags__in=tags)
Так подытожить, если я нужна деятельность со списком пользователей и список тегов Я должен сделать так:
activites = Activity.objects.filter(
Q(actor__in=user_list) |
Qposts__tags__in=tag_list) |
Q(photos__tags__in=tag_list)
)
Но предположим, что там будет быть более двух классов модели ContentType, тогда мне придется снова добавить еще Q(moreModel__tags__in=tag_list)
. Итак, я надеюсь, что есть лучший способ оптимизировать процесс.
Ok я погляжу. – Robin
@Robin hello robin, теперь, в моем проекте в настоящее время получилось аналогичное условие, такое как ваша проблема ... Я создаю форум, на котором есть система уведомлений ... так, чтобы обрабатывать его с созданием поля 'receiver' и' sender'. . надеюсь, что мои фрагменты полезны для вас: https://gist.github.com/agusmakmun/6607cbd13b7e6b06a0da97cd18b2ef22 –