reza ataei
3 سال پیش توسط reza ataei مطرح شد
2 پاسخ

دریافت نام دسته بندی بصورت نال در خروجی جیسون با جنگو

سلام.دوستان چرا نام دسته بندی من در خروجی جیسون که با رست فریمورک جنگو ساختم نال برمیگرده
خروجی جیسون

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

# Create your models here.

class Category(models.Model):
    parent = models.ForeignKey('self', default=None, null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    image = models.ImageField(upload_to='category', null=True)

    def __str__(self):
        return self.name

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    body = models.TextField()
    status = models.BooleanField(default=False)
    image = models.ImageField(blank=True, default=True)
    favorite = models.BooleanField(default=False)
    published = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    category = models.ManyToManyField(Category,)

    def __str__(self):
        return self.title
from .models import Post, Category
from rest_framework import serializers
from django.contrib.auth import get_user_model

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ["id", "name", "image"]

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = ["id", "username", "email"]

class PostSerializer(serializers.ModelSerializer):
    category = serializers.CharField(source="category.name", read_only=True)
    author = serializers.CharField(source="author.username", read_only=True)

    class Meta:
        model = Post
        fields = "__all__"

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = "__all__"
from .models import Post, Category
from django.contrib.auth import get_user_model
from .serializers import PostSerializer, CategorySerializer, UserSerializer
from rest_framework.viewsets import ModelViewSet
from .permissions import IsStaffOrReadOnly, IsAuthorOrReadOnly, IsSuperUserOrStaffReadOnly

class UserView(ModelViewSet):
    queryset = get_user_model().objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsSuperUserOrStaffReadOnly,)

class CategoryView(ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer

    def get_permissions(self):
        if self.action in ['list', 'create']:
            permission_classes = [IsStaffOrReadOnly]
        else:
            permission_classes = [IsStaffOrReadOnly, IsAuthorOrReadOnly]
        return [permission() for permission in permission_classes]

class PostView(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    filterset_fields = ['status', 'author__username']
    search_fields = ['title', 'body', 'author__username']
    ordering_fields = ['status', 'published']
    ordering = ['-published']

    def get_permissions(self):
        if self.action in ['list', 'create']:
            permission_classes = [IsStaffOrReadOnly]
        else:
            permission_classes = [IsStaffOrReadOnly, IsAuthorOrReadOnly]
        return [permission() for permission in permission_classes]

ثبت پرسش جدید
علیرضا ماستری
تخصص : برنامه نویس پایتون و جاوااسکری...
@alirezamastery 3 سال پیش مطرح شد
2

سلام
دلیلش این هست که category در مدل Post از نوع ManyToMany هست. اگر میخواید اسم category های مربوطه رو بگیرید یک راهش این میتونه باشه:

class PostSerializer(serializers.ModelSerializer):
    category = serializers.SerializerMethodField('category_names')
    author = serializers.CharField(source='author.username', read_only=True)

    class Meta:
        model = Post
        fields = '__all__'

    def category_names(self, obj):
        return obj.category.all().values_list('name', flat=True)

reza ataei
تخصص : در حال یادگیری.....
@rezaataei54 3 سال پیش مطرح شد
1

ممنونم..عالی


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام