【问题标题】:nested resource many to many query with rest api django使用rest api django的嵌套资源多对多查询
【发布时间】:2014-10-25 17:49:40
【问题描述】:

我发现我的问题很难找到解决方案,我正在尝试做这样的事情:

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

在我的 CompanyViewSet 中,我可以进入名为 car 的函数,并且 car 实例恰到好处.. 但我无法将其放入序列化程序并显示信息

我有以下代码:

型号:

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)

序列化器:

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

观看次数:

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

当我在公司/1 时,我希望能够添加汽车并查看该公司所有请求的汽车,这可能吗?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:
    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 
    

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 2014-12-15
      • 2017-10-19
      • 2021-09-02
      • 1970-01-01
      • 2015-09-21
      • 2016-01-27
      • 1970-01-01
      相关资源
      最近更新 更多