DRF 链式显示的问题,serializer.charField(source=xxx)的使用

DRF 链式显示的问题,serializer.charField(source=xxx)的使用
两个模型类
class OrderModel(models.Model):
	    customer = models.ForeignKey(to='customermodel',on_delete=models.DO_NOTHING,related_name='order',null=True,blank=True,db_constraint=False)
	    
class CustomerModel(models.Model):
    user = models.ForeignKey(to='login.User',on_delete=models.DO_NOTHING,null=True,blank=True,db_constraint=False,related_name='customer')

序列化器类
正向查询
class OrderSerializer(serializers.ModelSerializer):
    # 链式查询,若想让界面显示外联的字段,需要在多的一方的序列化器中,重新定义,source指向,并添加到fields字段
    customer = serializers.CharField(source='customer.user')
    class Meta:
        model = OrderModel
        fields = ('order_name','delivery_num','description','is_delivery','customer')
反向查询
class CustomerSerializer(serializers.ModelSerializer):
# 定义的字段必须与releate_name相同
	order = OrderSerializer(many=True)
    class Meta:
        model = CustomerModel
        fields = ('name','age','phone','sex','address','user')
        
class OrderViewSet(ModelViewSet):
    # queryset = OrderModel.objects.all()
    serializer_class = OrderSerializer
    def get_queryset(self):
        # queryset = OrderModel.objects.all()

        if self.request.user.is_superuser:
            queryset = OrderModel.objects.all()
        else:
        # 链式查询字段名__另一个模型关联字段名__另一个模型的关联字段名  这是一个三级关联查询
            queryset = OrderModel.objects.filter(customer__user__username=self.request.user)
        return queryset

参考链接
https://blog.csdn.net/weixin_38836909/article/details/112790439
比较全面的参考博客:
https://www.liujiangblog.com/course/django/129

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 使用serializer 在django template中,可以通过调用drf中的serializer来渲染数据。首先,需要在view中定义好serializer,并将查询到的数据序列化后传递给模板。例如: ```python from rest_framework import serializers class BookSerializer(serializers.ModelSerializer): class Meta: model = Book fields = ['id', 'title', 'author', 'publish_date'] def book_list(request): books = Book.objects.all() serializer = BookSerializer(books, many=True) return render(request, 'book_list.html', {'books': serializer.data}) ``` 然后,在模板中使用django的模板语言展示序列化后的数据: ```html {% for book in books %} <div> <h3>{{ book.title }}</h3> <p>{{ book.author }}</p> <p>{{ book.publish_date }}</p> </div> {% endfor %} ``` 2. 使用Pagination 如果需要在django template中使用drf中的分页功能,可以通过调用Pagination类来实现。首先,需要在view中定义好pagination,并将查询到的数据和pagination对象传递给模板。例如: ```python from rest_framework.pagination import PageNumberPagination class BookPagination(PageNumberPagination): page_size = 10 page_size_query_param = 'page_size' max_page_size = 100 def book_list(request): books = Book.objects.all() pagination = BookPagination() result_page = pagination.paginate_queryset(books, request) serializer = BookSerializer(result_page, many=True) return render(request, 'book_list.html', {'books': serializer.data, 'paginator': pagination}) ``` 然后,在模板中使用django的模板语言展示分页后的数据: ```html {% for book in books %} <div> <h3>{{ book.title }}</h3> <p>{{ book.author }}</p> <p>{{ book.publish_date }}</p> </div> {% endfor %} <div class="pagination"> <span class="step-links"> {% if page_obj.has_previous %} <a href="?page=1">« first</a> <a href="?page={{ page_obj.previous_page_number }}">previous</a> {% endif %} <span class="current-page"> Page {{ page_obj.number }} of {{ paginator.num_pages }} </span> {% if page_obj.has_next %} <a href="?page={{ page_obj.next_page_number }}">next</a> <a href="?page={{ paginator.num_pages }}">last »</a> {% endif %} </span> </div> ``` 3. 使用Filter 如果需要在django template中使用drf中的过滤功能,可以通过调用FilterSet类来实现。首先,需要在view中定义好filter,并将查询到的数据和filter对象传递给模板。例如: ```python from django_filters import rest_framework as filters class BookFilter(filters.FilterSet): title = filters.CharFilter(lookup_expr='icontains') author = filters.CharFilter(lookup_expr='icontains') class Meta: model = Book fields = ['title', 'author'] def book_list(request): books = Book.objects.all() book_filter = BookFilter(request.GET, queryset=books) serializer = BookSerializer(book_filter.qs, many=True) return render(request, 'book_list.html', {'books': serializer.data, 'filter': book_filter}) ``` 然后,在模板中使用django的模板语言展示过滤后的数据: ```html <form method="get"> <label for="title">Title:</label> <input type="text" id="title" name="title" value="{{ filter.form.title.value }}"> <label for="author">Author:</label> <input type="text" id="author" name="author" value="{{ filter.form.author.value }}"> <button type="submit">Filter</button> </form> {% for book in books %} <div> <h3>{{ book.title }}</h3> <p>{{ book.author }}</p> <p>{{ book.publish_date }}</p> </div> {% endfor %} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值