Python 使用uid(用户名、用户ID)的Django Rest框架查询

Python 使用uid(用户名、用户ID)的Django Rest框架查询,python,django,django-models,django-views,django-rest-framework,Python,Django,Django Models,Django Views,Django Rest Framework,我正在用Django Rest框架构建一个应用程序 这是我的Django模型: class Location(models.Model): uid = models.ForeignKey('auth.User', related_name='locations', unique=True, on_delete=models.CASCADE) area = models.IntegerField(choices=AREA, default=0) address = mode

我正在用Django Rest框架构建一个应用程序

这是我的Django模型:

class Location(models.Model):
    uid = models.ForeignKey('auth.User', related_name='locations', unique=True, on_delete=models.CASCADE)
    area = models.IntegerField(choices=AREA, default=0)
    address = models.TextField(max_length=150)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('created_at',)
        verbose_name = 'Location'
        verbose_name_plural = 'Locations'

    def __str__(self):
        return self.area
我的序列化程序:

class LocationSerializer(serializers.ModelSerializer):
    # owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = Location
        fields = '__all__'
我的看法是:

class LocationViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list` and `detail` actions.
    """
    queryset = Location.objects.all()
    serializer_class = LocationSerializer
    permission_classes = (permissions.IsAuthenticated, permissions.IsAdminUser,)
使用
路由器注册我的路由。注册

router = DefaultRouter()
router.register(r'locations', views.LocationViewSet)
当我这样查询时:
localhost:8000/locations/
我得到特定位置匹配位置id的结果。但我想用用户名/id这样查询:
localhost:8000/locations/
。我怎样才能做到这一点


注意:我是Django的新手。

我们可以覆盖
。get_queryset()
来处理URL,例如,并且仅当URL中包含用户名参数时才过滤queryset:

class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer

def get_queryset(self):
    """
    Optionally restricts the returned purchases to a given user,
    by filtering against a `username` query parameter in the URL.
    """
    queryset = Purchase.objects.all()
    username = self.request.query_params.get('username', None)
    if username is not None:
        queryset = queryset.filter(purchaser__username=username)
    return queryset

从Docs

中,我们可以覆盖
。get_queryset()
来处理URL,例如,并且仅当URL中包含username参数时才过滤queryset:

class PurchaseList(generics.ListAPIView):
serializer_class = PurchaseSerializer

def get_queryset(self):
    """
    Optionally restricts the returned purchases to a given user,
    by filtering against a `username` query parameter in the URL.
    """
    queryset = Purchase.objects.all()
    username = self.request.query_params.get('username', None)
    if username is not None:
        queryset = queryset.filter(purchaser__username=username)
    return queryset

从文档中

如果您想使用
位置/
位置/
位置/uid
,那么您的API设计很差。资源应该只有一个id。使用查询参数
locations?user\u id=
或使其他资源
location/user/
。可以提供帮助。如果您想使用
位置/
位置/
位置/uid
,那么您的API设计很差。资源应该只有一个id。使用查询参数
locations?user\u id=
或使其他资源
location/user/
。我可以帮忙。