drf m2m 多次连表

# 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
		
			
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值