Home > Software engineering >  Django how to query on many to many relationship
Django how to query on many to many relationship

Time:01-30

This is my model

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)

This is my serializer

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__'

And this Is my view

@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)

this is my URL http://127.0.0.1:8000/venue_menu_response_list?venue=venu_name

I want to get all the venue and menu item associated with that venue ,this query is returning empty result, so i think the problem is in my query.

CodePudding user response:

Try these and see.. make sure you are passing the venue in the get request

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)

OR

@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)

Also please show me your urls too

CodePudding user response:

add venue serializer:

class VenueSerializer(serializers.ModelSerializer):

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

Then change VenueMenuSerializer like below:

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__'
  •  Tags:  
  • Related