簡體   English   中英

drf viewset:多項選擇

[英]drf viewset : multiple choices

我試圖制作按區域顯示項目的方法(location_item)。 我想用多種選擇來實現'gu,dong'字段(在位置模型中)。 所以,寫了這個方法代碼。 但過濾不起作用..這顯示所有項目對象,而不僅僅是我想要的對象。

類型錯誤:字段 'id' 需要一個數字,但得到 <Item: 애니원모어 원피스입니다.>: [13/Aug/2022 15:01.07] "GET /item_post/location/location_item/ HTTP/1.1" 500 152955

我不知道我該怎么做。 請幫我...

模型.py

class Item(models.Model):
    user_id = models.ForeignKey(User, related_name='item_sets', on_delete=models.CASCADE)
    category_id = models.ForeignKey(Category, related_name='item_sets', on_delete=models.DO_NOTHING)
    description = models.TextField()
    feature = models.TextField()
    product_defect = models.TextField()
    size = models.CharField(max_length=6)
    wear_count = models.IntegerField()
    price = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.description


class Location(models.Model):
    city = models.CharField(max_length=10)
    gu = models.CharField(max_length=10)
    dong = models.CharField(max_length=10)

    def __str__(self):
        return self.city+" "+self.gu+" "+self.dong


class LocationSet(models.Model):
    item_id = models.ForeignKey(Item, on_delete=models.CASCADE, related_name='location_sets')
    location_id = models.ForeignKey(Location, on_delete=models.CASCADE, related_name='location_sets')

序列化程序.py

class ItemSerializer(serializers.ModelSerializer):
    photos = PhotoSerializer(source='photo_sets', many=True, read_only=True)
    style_photos = StylePhotoSerializer(source='style_photo_sets', many=True, read_only=True)

    class Meta:
        model = Item
        fields = '__all__'


class LocationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Location
        fields = '__all__'


class LocationSetSerializer(serializers.ModelSerializer):
    class Meta:
        model = LocationSet
        fields = '__all__'

視圖.py

class ItemViewSet(ModelViewSet):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['description']    # ?search=
    ordering_fields = ['-created_at']  # ?ordering=
    ordering = ['-created_at']

    # here
    @action(detail=False, methods=['GET'])
    def location_item(self, request):
        locations = Location.objects.all()
        city = request.GET.get('city', None)  
        gu = request.GET.getlist('gu', None)  # multiple choices
        dong = request.GET.getlist('dong', None)  # multiple choices
        print(city, " ", gu, " ", dong)  # > None   []   [] (upper codes not work..)
        if city:
            locations = locations.filter(city=city)
        if gu:
            locations = locations.filter(gu__in=gu).distinct()
        if dong:
            locations = locations.filter(dong__in=dong).distinct()

        location_ids = []
        for i in locations:
            location_ids.append(i.id)

        locationsets = LocationSet.objects.filter(location_id__in=location_ids)

        item_ids = []
        for i in locationsets:
            item_ids.append(i.item_id)
        serializer = self.get_serializer(item_ids, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

創建按區域顯示項目的方法。 我該怎么辦?

我認為最后幾行代碼是錯誤的。

...

@action(detail=False, methods=['GET'])
def location_item(self, request):
    ...

    # here I changed the last four lines
    item_ids = [x.item_id for x in locationsets]
    serializer = self.get_serializer(item_id__id__in = item_ids, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM