从Django REST中的两个数据库中合并QuerySet



我的API中有两条路线看起来像:

http://mywebsite/weblites/weblot_1/annonces/

http://mywebsite/weblites/werfeent_2/annonces/

我需要制作一个合并这2条路线的listApiview,但每条路线都调用其自己的数据库。

这两个数据库是使用相同的Django模型制成的。我制作了两个数据库,因为它更适合我的体系结构。

问题在于,我的数据库中没有列,可以指示记录来自的网站。记录仅通过其数据库的名称区分。

我想在单个路线中获得所有记录

 class Annonce(models.Model):
     annonce_type = models.CharField(max_length=200, blank=True, null=True)
     annonce_id = models.CharField(unique=True, max_length=200, blank=True, null=True)
     url = models.TextField(blank=True, null=True)
     region = models.TextField(blank=True, null=True)
 class AnnoncesList(generics.ListAPIView):
     authentication_classes = ()
     permission_classes = ()
     serializer_class = AnnonceListSerializer
     pagination_class = LargeResultsSetPagination
     filter_backends = (DjangoFilterBackend,)
     filterset_fields = ('advert_type', 'asset_type', 'sales_type', 'price', 'area', 'department', 'department_id', 'city', 'postal_code')
     def get_queryset(self):
         queryset = Annonce.objects.using(self.kwargs["website_name"]).all()
         return queryset

为每个数据库制作QuerySet,然后使用annotate()在QuerySet上的每个记录中添加website_name列。将QuerySets加入到列表中(检查此((将点击数据库上的所有项目(,请确保QuerySet已经正确过滤了。

from itertools import chain
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from django.db.models import Value, CharField

class AnnonceMergedList(ListAPIView):
    serializer_class = AnnonceMergedListSerializer
    queryset = Annonce.objects.all()
    def list(self, request, **kwargs):
        # Make the querysets for each database
        q1 = self.get_queryset().using('website_1').annotate(website_name=Value('website_1', CharField()))
        q2 = self.get_queryset().using('website_2').annotate(website_name=Value('website_2', CharField()))
        # Filtering the querysets
        q1 = self.filter_queryset(q1)
        q2 = self.filter_queryset(q2)
        # Merge (hit items on database)
        data = list(chain(q1, q2))
        serializer = self.get_serializer(data, many=True)
        return Response(serializer.data)

此视图的序列化器必须接收website_name才能显示网站记录来自

class AnnonceMergedListSerializer(serializers.ModelSerializer):
    website_name = serializers.CharField(read_only=True) # Field from annotation
    class Meta:
        model = Annonce
        fields = ('website_name', ...)

最新更新