omri_saadon
omri_saadon

Reputation: 10631

nested resource many to many query with rest api django

i find it hard to find a solution for my problem, i'm trying to do something like this:

/127.0.0.1:8080/companies/1/cars/1

in my CompanyViewSet i can get inside the function named car and the car instance is just right.. but im no able to put it inside the serializer and to show the information

i have the following code:

model:

class Car(models.Model):
    name = models.CharField(max_length=255)
    price = models.IntegerField(default=0)
    created = models.DateTimeField(auto_now=True)
    companies = models.ManyToManyField('Company', related_name='CarBelongToCompny',      through='CarBelongToCompny')
    objects = PassThroughManager.for_queryset_class(CarQueries)()

    def __unicode__(self):
        return self.name

    def save(self,*args,**kwargs):
        super(Car, self).save(*args, **kwargs)
        return self


class Company(models.Model):
    cities = (
    ('rishon leziyyon', 'rishon leziyyon'),
    ('tel aviv', 'tel aviv'),
    ('beer sheva', 'beer sheva'),
    ('eilat', 'eilat'),
    ('kefar saba', 'kefar saba'),
    )
    name = models.CharField(max_length=255)
    city = models.CharField(max_length=255,
                        choices=cities,)
    phone_number = models.IntegerField(default=0)
    is_active = models.BooleanField(default=True)
    cars = models.ManyToManyField('Car', related_name='CarBelongToCompny', through='CarBelongToCompny')
    objects = PassThroughManager.for_queryset_class(ComapniesQuerySet)()

    def __unicode__(self):
        return self.name
    def save(self,*args,**kwargs):
        super(Company, self).save(*args, **kwargs)
        return self


class CarBelongToCompny(models.Model):
    price_at_company = models.IntegerField(default=0)
    company = models.ForeignKey(Company, related_name='companyName')
    car = models.ForeignKey(Car, related_name='carName')
    objects = PassThroughManager.for_queryset_class(CarBelongCompanyQueries)()
    def __unicode__(self):
        return self.car.name + " " + self.company.name + " " + str(self.price_at_company)

serializer:

class CompanySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Company

class PriceListSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.CarBelongToCompny

class CarSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.Car

views:

class CarViewSet(NestedViewSetMixin, viewsets.ModelViewSet):
    queryset = Car.objects.all()
    serializer_class = CarSerializer


class CompanyViewSet(NestedViewSetMixin, viewsets.ModelViewSet):
    queryset = Company.objects.all()
    serializer_class = CompanySerializer

    @link()
    def cars(self, request, pk):
        cars = CarBelongToCompny.objects.filter(company__id=pk)
        serializer = PriceListSerializer(cars)
        return Response(serializer.data)


class PriceListViewSet(NestedViewSetMixin, viewsets.ModelViewSet):
    queryset = CarBelongToCompny.objects.all()
    model = models.CarBelongToCompny

when im in the companies/1 i want to be able to add the cars and to see all the requested cars that in that company, is it possible?

Upvotes: 1

Views: 270

Answers (1)

Venkatesh Bachu
Venkatesh Bachu

Reputation: 2553

class CompanyViewSet(NestedViewSetMixin, viewsets.ModelViewSet):
    queryset = Company.objects.all()
    serializer_class = CompanySerializer

    @action(methods=['GET', 'POST'])
    def cars(self, request, pk):
        if request.method== "GET":
           cars = CarBelongToCompny.objects.filter(company__id=pk)
           serializer = PriceListSerializer(cars)
           return Response(serializer.data)
        if request.method== "POST":
           ################ 
           # create logic 

Upvotes: 1

Related Questions