tutorial queryset objects latest cual consultas avanzadas django django-models django-views django-orm

queryset - django-obtener una lista de objetos mediante el filtrado de una lista de objetos



objects.filter django (1)

Estoy creando un flujo de actividad de usuario.

modelos para la actividad:

class Activity(models.Model): actor = models.ForeignKey(User) action = models.CharField(max_length=100) content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey(''content_type'', ''object_id'') pub_date = models.DateTimeField(auto_now_add=True, auto_now=False)

modelo para la relación:

class Person(models.Model): user = models.OneToOneField(User) relationships = models.ManyToManyField(''self'', through=''Relationship'', symmetrical=False, related_name=''related_to'') RELATIONSHIP_FOLLOWING = 1 RELATIONSHIP_BLOCKED = 2 RELATIONSHIP_STATUSES = ( (RELATIONSHIP_FOLLOWING, ''Following''), (RELATIONSHIP_BLOCKED, ''Blocked''), ) class Relationship(models.Model): from_person = models.ForeignKey(Person, related_name=''from_people'') to_person = models.ForeignKey(Person, related_name=''to_people'') status = models.IntegerField(choices=RELATIONSHIP_STATUSES) def get_relationships(self, status): return self.relationships.filter( to_people__status=status, to_people__from_person=self) def get_following(self): return self.get_relationships(RELATIONSHIP_FOLLOWING)

En las vistas:

def home(request): if request.user.is_authenticated(): user = request.user userP = Person.objects.get_or_create(user=user) userP = userP[0] following = userP.get_following() activities = Activity.objects.filter(actor__in=following) if request.POST: form = StatusForm(request.POST, request.FILES) if form.is_valid(): if form.cleaned_data: status = form.save(commit=False) status.user = user status.save() return HttpResponseRedirect(''/'')

Guión

  • el usuario está siguiendo user2 y user3
  • user2 está siguiendo user y user3
  • user3 está siguiendo user y user2

Como estoy filtrando actividades con actor=user y no actor=userP (que es un objeto de tipo user.person ). ¿Cómo obtendré una lista de user object de user object del método get_following() de la lista y no del user.person object ?

Sin embargo, puedo recorrer cada uno de los following como following :

following = userP.get_following() users = [] for u in following: users.append(u.user) users.append(user) activities = Activity.objects.filter(actor__in=users)

¿Pero espero que haya otra forma mejor de hacerlo?

Por favor guíame. Tu ayuda será muy apreciada. Gracias.


Use el método values_list () del conjunto de preguntas :

activities = Activity.objects.filter(actor__in= following.values_list(''user'', flat=True))

Si desea agregar otro usuario a la lista de actores, entonces debe convertir valies_list de queryset a la lista de python normal:

actors = list(following.values_list(''user'', flat=True)) + [user.id] activities = Activity.objects.filter(actor__in=actors)