ForeignKey не appers в виде просматриваемого API Django остальные рамки - PullRequest
0 голосов
/ 24 января 2020

У меня есть модель разговора для добавления топи c, и мне нужно добавить различные категории. Итак, с django mptt я создал две модели. кажется, что в принципе это работает. Но только с панелью администратора Django. Если я пытаюсь создать разговор из оставшегося браузера, категория поля не отображается в форме. В чем будет причина? Спасибо.

Это мой код:

models.py

class Conversacion(models.Model):
    creado_a_las = models.DateTimeField(auto_now_add = True) #Aunque no se la mostraremos al usuario, es una buena práctica tener esto en cuenta
    actualizado_a_las = models.DateTimeField(auto_now = True)
    texto = models.CharField(max_length=480)
    contenido = models.CharField(max_length=90) # Es en realidad el titulo
    slug = models.SlugField(max_length=500, unique=True) #Para saber los detalles de un aporte en cuestión
    autor = models.ForeignKey(settings.AUTH_USER_MODEL, 
                              on_delete= models.CASCADE,
                              related_name= "autor")
    categoria = models.ForeignKey('Category', on_delete= models.CASCADE,)   

    def __str__(self):
        return self.contenido

class Category(MPTTModel):

    name = models.CharField(max_length=80, unique=True)
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, default= 1, blank=True, related_name='subcategoria')

    class MPTTMeta:
        order_insertion_by = ['name']

    class Meta:
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

serializers.py

class ConversacionSerializer(serializers.ModelSerializer):
    autor = serializers.StringRelatedField(read_only= True)
    creado_a_las =  serializers.SerializerMethodField() 
    actualizado_a_las = serializers.SerializerMethodField()

    slug = serializers.SlugField(read_only = True)

    respuesta_cuenta = serializers.SerializerMethodField()
    usuario_ha_respondido = serializers.SerializerMethodField()


    class Meta:
        model = Conversacion
        fields = '__all__'
        depth = 2

    def get_usuario_ha_respondido(self, instance):
        request =  self.context.get("request") 
        return instance.respuesta.filter(autor=request.user).exists()


# Clase para la vista

class CategorySerializer(serializers.ModelSerializer):

    subcategoria = RecursiveField(many=True,allow_null=True)
    class Meta():
        model= Category
        fields=['id','name','subcategoria']

views.py

class ConversacionViewSet(viewsets.ModelViewSet):
    queryset = Conversacion.objects.all().order_by("-creado_a_las") 
    lookup_field = "slug"
    serializer_class = ConversacionSerializer
    permission_classes = [IsAuthenticated, IsAuthorOrReadOnly]

    def perform_create(self, serializer):
        serializer.save(autor=self.request.user)

class CategoryListCreateAPIView(generics.ListCreateAPIView):
    permission_classes = [IsAuthenticated, IsAdminUser]
    serializer_class = CategorySerializer

    def get_queryset(self):
        return Category.objects.exclude(parent__isnull=False)

class CategoryRUDAPIView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    permission_classes = [IsAuthenticated, IsAdminUser]


urls.py

router = DefaultRouter()
router.register(r"conversaciones" , qv.ConversacionViewSet)

urlpatterns = [
path("", include(router.urls)),

    path("categorias/", qv.CategoryListCreateAPIView.as_view(),  name = "crear-categoria"),

    path("categorias/<int:pk>/", qv.CategoryRUDAPIView.as_view(),  name = "detalle-categoria"),
]
...