Saya punya pertanyaan tentang berurusan dengan m2m / through model dan presentasi mereka dalam kerangka kerja django. Mari kita ambil contoh klasik:
models.py:
from django.db import models
class Member(models.Model):
name = models.CharField(max_length = 20)
groups = models.ManyToManyField('Group', through = 'Membership')
class Group(models.Model):
name = models.CharField(max_length = 20)
class Membership(models.Model):
member = models.ForeignKey('Member')
group = models.ForeignKey('Group')
join_date = models.DateTimeField()
serializers.py:
imports...
class MemberSerializer(ModelSerializer):
class Meta:
model = Member
class GroupSerializer(ModelSerializer):
class Meta:
model = Group
views.py:
imports...
class MemberViewSet(ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
class GroupViewSet(ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
Saat MENDAPATKAN instance Anggota, saya berhasil menerima semua bidang anggota dan juga grupnya - namun saya hanya mendapatkan detail grup, tanpa detail tambahan yang berasal dari model Keanggotaan.
Dengan kata lain saya berharap untuk menerima:
{
'id' : 2,
'name' : 'some member',
'groups' : [
{
'id' : 55,
'name' : 'group 1'
'join_date' : 34151564
},
{
'id' : 56,
'name' : 'group 2'
'join_date' : 11200299
}
]
}
Catat join_date .
Saya telah mencoba oh begitu banyak solusi, termasuk tentu saja halaman resmi Django Rest-Framework tentang hal itu dan tampaknya tidak ada yang memberikan jawaban jelas yang tepat tentangnya - apa yang perlu saya lakukan untuk menyertakan bidang tambahan ini? Saya merasa lebih mudah dengan django-tastypie tetapi memiliki beberapa masalah lain dan lebih memilih rest-framework.
Jawaban:
Bagaimana tentang.....
Di MemberSerializer Anda, tentukan bidang di atasnya seperti:
dan kemudian pada serializer keanggotaan Anda, Anda dapat membuat ini:
Itu memiliki efek keseluruhan untuk membuat nilai serial, grup, yang memiliki sumber keanggotaan yang Anda inginkan, dan kemudian menggunakan serializer kustom untuk menarik bit yang ingin Anda tampilkan.
EDIT: seperti yang dikomentari oleh @bryanph,
serializers.field
diubah namanya menjadiserializers.ReadOnlyField
di DRF 3.0, jadi ini akan membaca:untuk implementasi modern apa pun
sumber
membership_set
adalah nama terkait default untuk Anggota -> KeanggotaanSaya menghadapi masalah ini dan solusi saya (menggunakan DRF 3.6) adalah menggunakan SerializerMethodField pada objek dan secara eksplisit menanyakan tabel Keanggotaan seperti:
Ini akan mengembalikan daftar dicts untuk kunci grup di mana setiap dict diserialkan dari MembershipSerializer. Untuk membuatnya dapat ditulisi, Anda dapat menentukan metode buat / perbarui Anda sendiri di dalam MemberSerializer tempat Anda mengulang data masukan dan secara eksplisit membuat atau memperbarui contoh model Keanggotaan.
sumber
CATATAN: Sebagai Insinyur Perangkat Lunak, saya suka menggunakan Arsitektur dan saya telah bekerja keras pada Pendekatan Berlapis untuk Pengembangan jadi saya akan Menjawabnya dengan Menghormati Tingkatan.
Saat saya memahami Masalahnya, Inilah Solution models.py
serializers.py
CustomModels.py
BusinessLogic.py
Secara teknis, Anda harus meneruskan Request ke DataAccessLayer yang akan mengembalikan Objek Tersaring dari Lapisan Akses Data tetapi karena saya harus Menjawab Pertanyaan dengan Cepat, jadi saya menyesuaikan Kode di Lapisan Logika Bisnis!
sumber