it-swarm.asia

Django istirahat çerçevesi birçok alana seri hale getirildi

Çoktan çoğa bir alanı bir şeyin listesine nasıl seri hale getirir ve bunları dinlenme çerçevesi içinde nasıl geri getiririm? Aşağıdaki örneğimde, gönderiyi, kendisiyle ilişkilendirilmiş bir etiket listesiyle birlikte döndürmeye çalışıyorum.

models.py

class post(models.Model):
    tag = models.ManyToManyField(Tag)
    text = models.CharField(max_length=100)

serializers.py

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ("text", "tag"??)

views.py

class PostViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
43
kengcc

class Metamodel = Tag 'a sahip bir TagSerializer dosyasına ihtiyacınız olacak. TagSerializer oluşturulduktan sonra, PostSerializer ilişkisi için ManyToManyField öğesini many=True ile değiştirin:

class PostSerializer(serializers.ModelSerializer):
    tag = TagSerializer(read_only=True, many=True)

    class Meta:
        ...

Cevap DRF 3 içindir

49
Brian

Yaptığım şey buydu, diyelim ki bir kitabın birden fazla yazarı olabilir ve bir yazarın birden fazla kitabı olabilir:

class Author(models.Model):
    name = models.CharField(max_length=100, default="")
    last_name = models.IntegerField(default=0)

class Book(models.Model):
    authors = models.ManyToManyField(Author, related_name="book_list", blank=True)
    name = models.CharField(max_length=100, default="")
    published = models.BooleanField(default=True)

Serileştiriciler Üzerinde:

class BookSerializer(serializers.ModelSerializer):
    authors = serializers.PrimaryKeyRelatedField(queryset=Author.objects.all(), many=True)

    class Meta:
        model = Book
        fields = ('id', 'name', 'published', 'authors')


class AuthorSerializer(serializers.ModelSerializer):
    book_list = BookSerializer(many=True, read_only=True)

    class Meta:
        model = Author
        fields = ('id', 'name', 'last_name', 'book_list')
3
Jesus Almaral

init metodundaki serileştiricide queryset'i alana iletebilir ve rest_framework bu queryset'in kimliklerini doğrulayabilir

1) ilk olarak seri hale getiriciyi seri hale getiricilerden genişletin.

class YourSerializer(serializers.ModelSerializer):

2) meta sınıfındaki alanı dahil et

class YourSerializer(serializers.ModelSerializer):
  class Meta:
        fields = (..., 'your_field',)

3) init yönteminde:

def __init__(self, *args, **kwargs):
    super(YourSerializer, self).__init__(*args, **kwargs)
    self.fields['your_field].queryset = <the queryset of your field>

Filtreyi kullanarak herhangi bir argüman altında o alan için queryset'i sınırlayabilir veya normalde yaptığınız gibi hariç tutabilirsiniz. İstediğiniz takdirde hepsi sadece kullanın sadece .objects.all () kullanın

2
yiyo

Django 2.0

Belirli bir alan istiyorsanız, birçok alan için:

class QuestionSerializer(serializers.ModelSerializer):

    topics_list = serializers.SerializerMethodField()

    def get_topics_list(self, instance):
        names = []
        a = instance.topics.get_queryset()
        for i in a:
            names.append(i.desc)
        return names
    class Meta:
        model = Question
        fields = ('topics_list',)
2
user5299374

Bu benim için çalışıyor.

tag = TagSerializer(source="tag", read_only=True, many=True)
1
Windsooon