2016-06-02 2 views
1

J'ai un commentaire de modèle qui peut aller sur Projet ou Tâche.Django Rest Framework Relations génériques et ViewSets

class Comment(BaseCommentModel): 
    author = models.ForeignKey(settings.AUTH_USER_MODEL) 
    content_type = models.ForeignKey(
      ContentType, 
      verbose_name=_('content type'), 
      related_name="contenttype_set_for_%(class)s" 
    ) 
    object_pk = models.TextField(_('object ID')) 
    content_object = GenericForeignKey(ct_field="content_type", fk_field="object_pk") 

projet et des tâches ont le terrain mis en place comme:

comments = GenericRelation(Comment) 

Les commentaires peuvent être créés sur des projets ou des tâches afin qu'il devrait y avoir un viewset pour chacun:

class ProjectCommentViewSet(viewsets.ViewSet): 

class TaskCommentViewSet(viewsets.ViewSet): 

Et ceux-ci afficheront les commentaires liés à chaque modèle.

Mais ce que je ne comprends pas:

  1. Comment puis-je configurer la création/mise à jour/supprimer dans un viewset pour le modèle Commentaire afin que le commentaire est créé avec la relation correcte?

  2. Comment puis-je filtrer dans les vues pour afficher les commentaires liés à ce modèle? Je ne peux pas utiliser select_related car le commentaire n'a pas de champ Projet ou Tâche.

  3. Comment écrire les HyperlinkedModelSerializer s pour ces relations? Dois-je ajouter un HyperlinkedIdentityField à CommentSerializer(), puis HyperlinkedRelatedField à l'utilisateur, au projet et aux sérialiseurs de tâches? Ou comment puis-je configurer cela?

Merci pour toute aide fournie, je pourrais vraiment utiliser une certaine direction ici.

Je n'arrive pas à comprendre comment les relations sur les modèles se traduisent par les sérialiseurs et les vues. Et aussi comment gérer les relations lors de l'utilisation de relations génériques.

Répondre

1

La clé est d'utiliser PrimaryKeyRelatedField. Cela renverra une liste d'ID, qui est ce que vous utiliseriez pour une création/mise à jour pour une instance de modèle Project avec des enregistrements Comment associés.

A part cela, GenericRelation se comporte exactement comme les autres relations ORM au sein de django-rest-framework.

Dans le ViewSetSerializer définissent comme ceci:

from rest_framework import viewsets, serializers 

class ProjectCommentViewSet(viewsets.ViewSet): 
    queryset = Project.objects.all() 
    serializer_class = ProjectSerializer 

class ProjectSerializer(serializers.ModelSerializer): 
    comments = serializers.PrimaryKeyRelatedField(
     queryset=Comment.objects.all(), many=True, required=False) 

    class Meta: 
     model = Project 
     fields = ('id', 'etc...', 'comments',) 
+0

Est-ce que je dois définir des champs pour content_type object_id et content_object dans le commentaire sérialiseur? – shenk

+0

Non, ceux-ci ne sont nécessaires que dans la définition 'model'. –