|
4 | 4 | from django.contrib.auth.models import User
|
5 | 5 |
|
6 | 6 | from django.db.models import Prefetch, Count
|
| 7 | +from django.db.models.expressions import Exists, OuterRef |
7 | 8 | from django.utils import timezone
|
8 | 9 |
|
9 | 10 | from rest_framework import mixins, viewsets, status
|
@@ -70,18 +71,30 @@ class DweetViewSet(mixins.RetrieveModelMixin,
|
70 | 71 | queryset = Dweet.objects.all().select_related(
|
71 | 72 | 'author',
|
72 | 73 | ).prefetch_related(
|
| 74 | + Prefetch('reply_to', queryset=Dweet.objects.select_related('author')), |
73 | 75 | 'likes',
|
| 76 | + Prefetch('remixes'), |
74 | 77 | Prefetch('comments', queryset=Comment.objects.select_related('author'))
|
| 78 | + ).annotate( |
| 79 | + awesome_count=Count('likes') |
75 | 80 | ).order_by('-hotness')
|
| 81 | + |
76 | 82 | serializer_class = DweetSerializer
|
77 | 83 |
|
| 84 | + def retrieve(self, request, pk): |
| 85 | + self.queryset = self.queryset.annotate( |
| 86 | + has_user_awesomed=Exists(Dweet.objects.filter( |
| 87 | + id=OuterRef('id'), likes__in=[request.user.id])) |
| 88 | + ) |
| 89 | + |
| 90 | + return super().retrieve(request, pk) |
| 91 | + |
78 | 92 | def create(self, request):
|
79 | 93 | code = request.data.get('code', '')
|
80 | 94 | if (length_of_code(code) > 140):
|
81 | 95 | raise ValidationError("Code longer than 140 characters")
|
82 | 96 |
|
83 | 97 | remix_of_pk = request.data.get('remix_of', -1)
|
84 |
| - |
85 | 98 | # Using filter().first() will return None if it doesn't exist
|
86 | 99 | # instead of raising a DoesNotExist exception
|
87 | 100 | remix_of = self.queryset.filter(pk=remix_of_pk).first()
|
@@ -130,6 +143,11 @@ def list(self, request):
|
130 | 143 | if order_by == '-awesome_count':
|
131 | 144 | self.queryset = self.queryset.annotate(awesome_count=Count('likes'))
|
132 | 145 |
|
| 146 | + self.queryset = self.queryset.annotate( |
| 147 | + has_user_awesomed=Exists(Dweet.objects.filter( |
| 148 | + id=OuterRef('id'), likes__in=[request.user.id])) |
| 149 | + ) |
| 150 | + |
133 | 151 | self.queryset = self.queryset.order_by(order_by).filter(
|
134 | 152 | posted__gte=posted_after, posted__lt=posted_before, **filters)
|
135 | 153 |
|
|
0 commit comments