6

Ich arbeite an einer Diskussion App in Django, die Threads, Beiträge, Antworten und Abstimmungen hat. Stimmen verwendet Generic Foreign Keys and Content Types, um sicherzustellen, dass ein Benutzer nur einmal für einen bestimmten Thread/Post/Antwort abstimmen kann.GenericForeignKey, ContentType und DjangoRestFramework

Vote Modell sieht wie folgt aus:

VOTE_TYPE = (
    (-1, 'DISLIKE'), 
    (1, 'LIKE'), 
) 

class Vote(models.Model): 
    user = models.ForeignKey(User) 
    content_type = models.ForeignKey(ContentType, 
     limit_choices_to={"model__in": ("Thread", "Reply", "Post")}, 
     related_name="votes") 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 
    vote = models.IntegerField(choices=VOTE_TYPE) 

    objects = GetOrNoneManager() 

    class Meta(): 
     unique_together = [('object_id', 'content_type', 'user')] 

Vote Serializer:

class VoteSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Vote 

Die Ansicht eine Abstimmung zu handhaben:

@api_view(['POST']) 
def discussions_vote(request): 

if not request.user.is_authenticated(): 
    return Response(status=status.HTTP_404_NOT_FOUND) 

data = request.DATA 

if data['obj_type'] == 'thread': 
    content_type = ContentType.objects.get_for_model(Thread) 

    print content_type.id 

    info = { 
     'content_type': content_type.id, 
     'user': request.user.id, 
     'object_id': data['obj']['id'] 
    } 

    vote = Vote.objects.get_or_none(**info) 

    info['vote'] = data['vote'] 

    ser = VoteSerializer(vote, data=info) 

    if ser.is_valid(): 
     print "Valid" 
    else: 
     pprint.pprint(ser.errors) 

return Response() 

request.DATA Inhalt:

{u'vote': -1, 
u'obj_type': u'thread', 
u'obj': 
    { 
    ... 
    u'id': 7, 
    ... 
    } 
} 

Wenn ich wählen, wirft Django Ruhe Framework-Serializer einen Fehler:

Model content type with pk 149 does not exist. 

149 ist die korrekte ID für die Contenttype für das Thread-Modell, nach

print content_type.id 

Ich bin ziemlich viel an Ein Verlust bei dem, was dazu führen könnte ...

Antwort

4

Das Problem ist wahrscheinlich, dass Sie einen generischen Fremdschlüssel dort haben, der mit jeder Art von Modellinstanz verknüpft werden könnte, also gibt es keine Standardmethode für die REST-Rahmenbestimmung wie man die serialisierten Daten darstellt.

Werfen Sie einen Blick auf die docs auf GFKs in Serializer hier, hoffentlich sollte es Ihnen helfen, sich ... http://www.django-rest-framework.org/api-guide/relations#generic-relationships

Wenn Sie noch auf der Suche nach es problematisch dann einfach aus Drop-Serializer ganz mit, und nur Führen Sie die Überprüfung explizit in der Ansicht durch, und geben Sie ein Wörterbuch mit allen Werten zurück, die Sie für die Repräsentation verwenden möchten.

Verwandte Themen