0

Ich implementiere 'Follow' CreateAPIView.CreateAPIView mit leerem Serializer (kein Feld)

FollowCreateAPIView - 'angemeldete Benutzer' von self.request.user wird - 'Benutzer-ID' wird die 'angemeldeten Benutzer' (von url) folgen will - mit den Informationen über, Folge neuen Daten!

Hier urls.py ist

url(r'^follow/(?P<user_id>\d+)$', FollowCreateAPIView.as_view(), name="user_profile"), 

Modell

class Follow(models.Model): 
    follower = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='follower') 
    following = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='following') 
    created_at = models.DateTimeField(auto_now_add=True) 

CreateAPIView (Ich kann nicht User_id von URL erhalten; print(following_id) kehrt None )

class FollowCreateAPIView(generics.CreateAPIView): 
    queryset = Follow.objects.all() 
    serializer_class = FollowCreateSerializer 

    def perform_create(self, serializer): 
     following_id = self.request.GET.get('user_id', None) 
     print(following_id) <<<<- HERE! 
     following_user = User.objects.filter(id=following_id) 
     serializer.save(follower=self.request.user, following=following_user) 

Serializer

  • Können Sie dieses Problem beheben? Und diese Like Funktion scheint sehr verbreitet. Haben Sie einen besseren Ansatz? (wenn Sie ... haben)

Vielen Dank!

+0

Überprüfen Sie die Update-Ansichten von DRF. Ich bin mir sicher, dass es Code gibt, der bereits das tut, was Sie brauchen - verwenden Sie die ID in der URL, um eine Modellinstanz zu erhalten, oder geben Sie 404 zurück, falls sie nicht gefunden wird. Sie könnten die verbleibende Logik in einer Unterklasse anpassen. – Risadinha

Antwort

3

Ich denke, Sie können den Wert mit Kwargs bekommen. Außerdem können Sie get anstelle von Filter verwenden, da id schrittweise und einzigartig ist.

try: 
    following_user = User.objects.get(id=self.kwargs['user_id']) 
except User.DoesNotExist: 
    raise Http404 

Danke Risadinha für das hinweisend.

+0

Sie können 'filter()' einfach gut verwenden. Abhängig davon, ob Sie 'DoesNotExist' ('get()') -Fehler abfangen wollen oder einfach nach 'None' oder' exists() '(' filter() ') suchen. – Risadinha

+1

In diesem Fall sollten Sie, wenn 'user_id' nicht gefunden wird,' Http404' heraufsetzen - das wäre das richtige Verhalten. – Risadinha

+0

@Risadinha aktualisiert. Danke, dass du das gezeigt hast :) –

Verwandte Themen