# models.py
from django.db import models
class M2MDemo(models.Models):
name = models.CharField(max_length=30)
detail = models.TextField()
class Demo(models.Models):
m2m = models.ManyToManyField(to=M2MDemo)
# view.py
from rest_framework.viewsets import ModelViewSet
from serializer import DemoSer
class DemoViewSet(ModelViewSet):
# 如何select_related相关表的指定字段?
quertset = Demo.objects.select_related().prefetch_related(
Prefetch('m2m', queryset=M2MDemo.objects.only('name'))
)
serializer_class = DemoSer
# serializer.py
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer
from model import Demo, M2MDemo
class M2MItemSer(ModelSerializer)):
class Meta:
fields = ('id', 'name')
class DemoSer(ModelSerializer):
m2m_item = serializer.ListField(child=M2MItemSer(), source='m2m.all', read_only=True)
many_times_refrence = serializer.SerializerMethodField()
class Meta:
model = Demo
fields = '__all__'
@property
det get_related_sth(self):
# 借用context避免二次(及以上)外键的n+1 (直接的外键可以通过 select_related和prefetch_related解决)
# 也可以数据库定义json字段记录外键等关系
'''
related_sth = models.JsonField(
help_text="""
{
'ralated':
}
"""
)
'''
if 'get_related_sth' in self.context:
return self.context['get_related_sth' ]
your_logic = 'xxx'
self.context['get_related_sth' ] = your_logic
return your_logic
def get_many_times_refrence(self, obj):
my_need = self.get_related_sth
my_need_by_id = obj.id
return my_need
drf m2m 多次连表
最新推荐文章于 2024-07-16 17:12:07 发布