【问题标题】:Django REST How to filter through a slash?Django REST 如何通过斜线过滤?
【发布时间】:2018-12-04 21:04:13
【问题描述】:

我在 API 上使用 Django REST。我的模特:

class Region(MPTTModel):
    name = models.CharField(max_length=50, unique=True)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children', on_delete=models.CASCADE)

class Category(MPTTModel):
    name = models.CharField(max_length=50, unique=True)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='child', on_delete=models.CASCADE)

class Ad(models.Model):
    id = models.IntegerField(primary_key=True, blank=True)
    title = models.CharField(max_length=30 , help_text='Title ads' , db_column='data')
    date_create = models.DateTimeField(auto_now=True,help_text='Date Create')
    description = models.TextField(max_length=300)
    region = TreeForeignKey(Region,blank=True , null=True, related_name='Reg',on_delete=models.CASCADE)
    category = TreeForeignKey(Category,blank=True , null=True, related_name='ad',on_delete=models.CASCADE)
    views = models.IntegerField(blank=True, null=True)
    price = models.IntegerField(blank=True, null=True)

我的序列化器:

class AdSerializer(serializers.ModelSerializer):
    images = serializers.StringRelatedField(many=True)
    class Meta:
        model = Ad
        fields = ('title', 'description', 'region', 'category','price' , 'date_create','id','views','images')

class CategorySerializer(serializers.ModelSerializer):
    ad = AdSerializer(many=True)
    child = RecursiveField(allow_null=True,required=False,many=True)
    class Meta:
        model = Category
        fields = ('name','id','ad','child')

class RegionSerializer(serializers.ModelSerializer):
    children = RecursiveField(allow_null=True, required=False,many=True)

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

views.py:

class AdViewSet(viewsets.ModelViewSet):
    queryset = Ad.objects.all().order_by('-date_create')
    serializer_class = AdSerializer

我现在如何编写 urls.py、views.py,以便我可以按区域和按类别过滤斜线?例如http://localhost:8000/{region}/{category}/。 如果有任何建议,我会很高兴,但我的英语很抱歉

【问题讨论】:

  • 是否可以使用嵌套路由器来实现?
  • 是的,有可能。
  • @Umair 不能展示小例子吗?
  • 作为答案发布先生,也许您需要根据需要对其进行调整

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


【解决方案1】:

我认为我们可以通过以下方式实现这一目标:

广告的基本路由器,然后是区域的嵌套路由器,希望您也可以为类别做同样的事情。对应的ViewSets,请根据您的情况仔细调查和使用lookup。

router = routers.SimpleRouter()
router.register(r'ad', AdViewSet, base_name='ad')
ads_router = routers.NestedSimpleRouter(router, r'ads', lookup='ad')
ads_router.register(r'region', AdRegionViewSet, base_name='ad-region')


class AdRegionViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = AdRegionSerializer

    def get_queryset(self):
        return Region.objects.filter(id__in=Ad.objects.filter(id=self.kwargs['ad_pk']))


class AdViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = AdSerializer
    queryset = Ad.objects.all()

信用和参考:https://github.com/alanjds/drf-nested-routers

【讨论】:

  • 你好@Umair!我想通过电话号码注册并使用此电话号码作为登录名。我怎么能用你不能建议的东西做到这一点?看了一些库,没有例子,无法实现。
  • 上述解决方案有效吗?如果是,那么stackoverflow.com/help/someone-answers 并且对于这个后续查询,可以打开另一个问题吗?
猜你喜欢
  • 2018-08-18
  • 2017-12-28
  • 2016-01-14
  • 2022-11-18
  • 2012-12-24
  • 2017-05-27
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多