【问题标题】:Django how to query on many to many relationshipDjango如何查询多对多关系
【发布时间】:2022-01-30 19:54:06
【问题描述】:

这是我的模特

class MenuItem(models.Model):
    name = models.CharField(max_length=500, null=False)
    description = models.CharField(max_length=500, null=True)
    image_url = models.CharField(max_length=1000, null=True)
    menu_category = models.ForeignKey(MenuCategory, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.name}'


class Venue(models.Model):
    name = models.CharField(max_length=500, null=False)

    def __str__(self):
        return f'{self.name}'


class VenueMenu(models.Model):
    venue = models.ForeignKey(Venue, null=False, on_delete=models.CASCADE)
    menu_item = models.ManyToManyField(MenuItem, null=False)

这是我的序列化器

class MenuItemSerializer(serializers.ModelSerializer):
    menu_category = MenuCategorySerializer()

    class Meta:
        model = MenuItem
        fields = '__all__'


class VenueMenuSerializer(serializers.ModelSerializer):
    menu_item = MenuItemSerializer(many=True)

    class Meta:
        model = VenueMenu
        fields = '__all__'

这是我的观点

@api_view(['GET'])
def venue_menu_response_detail(request):
    if request.GET.get('venue'):
        venue_menu_list = VenueMenu.objects.filter(venue__name=request.GET.get('venue'))
        serializer = VenueMenuSerializer(venue_menu_list, many=True)
        return Response(serializer.data)

这是我的网址 http://127.0.0.1:8000/venue_menu_response_list?venue=venu_name

我想获取与该场地关联的所有场地和菜单项,此查询返回空结果,所以我认为问题出在我的查询中。

【问题讨论】:

  • 查询看起来没问题,你确定你指向的是urls.py中的正确视图吗?
  • 是的,当我根据场地__id 查询但在场地__name 上返回空时,查询正在运行

标签: python-3.x django django-rest-framework django-views django-serializer


【解决方案1】:

试试这些看看..确保你在获取请求中传递了场地

from django.http import Http404

@api_view(['GET'])
def venue_menu_response_detail(request):
        try:
            venue_name = request.query_params['venue']
        except:
            raise Http404
        venue_menu_list = VenueMenu.objects.all().filter(venue__name=venue_name)
        serializer = VenueMenuSerializer(venue_menu_list, many=True)
        return Response(serializer.data)

@api_view(['GET'])
def venue_menu_response_detail(request,venue=None):
        if venue==None:
            raise Http404
        venue_menu_list = VenueMenu.objects.all().filter(venue__name=venue_name)
        serializer = VenueMenuSerializer(venue_menu_list, many=True)
        return Response(serializer.data)

也请告诉我你的网址

【讨论】:

  • @Shahzan 它正在工作,但在响应中它返回了我需要的所有菜单项信息,这非常好,但是对于场地它只返回场地的 id但我需要带有场地名称的整个对象,请您在序列化程序中进行一些更改
【解决方案2】:

添加场地序列化器:

class VenueSerializer(serializers.ModelSerializer):

    class Meta:
        model = Venue
        fields = ('id', 'name')
      

然后像下面这样更改 VenueMenuSerializer:

class VenueMenuSerializer(serializers.ModelSerializer):
    menu_item = MenuItemSerializer(many=True)
    venue = VenueSerializer(many=False) # if have multiple record set it True

    class Meta:
        model = VenueMenu
        fields = '__all__'

【讨论】:

    猜你喜欢
    • 2017-02-02
    • 2015-10-26
    • 1970-01-01
    • 2013-11-22
    • 2011-11-13
    • 1970-01-01
    • 2014-07-14
    • 2021-03-07
    • 2019-05-18
    相关资源
    最近更新 更多