Django REST框架-按字段值的查询模型

Django REST框架-按字段值的查询模型,django,django-rest-framework,Django,Django Rest Framework,我有一个建筑模型,我已经为它创建了序列化程序和ModelViewSet。现在,我可以使用/api/Buildings/获取所有建筑物,并使用/api/Buildings/3获取建筑物对象,其中3是建筑物Id 如何查询具有特定属性值的建筑对象?例如,如何获取名称为“hospital”的建筑对象?类似于/api/buildings?name=hospital的东西不起作用 视图.py class APIBuildingsViewSet(viewsets.ModelViewSet): quer

我有一个建筑模型,我已经为它创建了序列化程序和ModelViewSet。现在,我可以使用
/api/Buildings/
获取所有建筑物,并使用
/api/Buildings/3
获取建筑物对象,其中3是建筑物Id

如何查询具有特定属性值的建筑对象?例如,如何获取名称为“hospital”的建筑对象?类似于
/api/buildings?name=hospital
的东西不起作用

视图.py

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
class Building(models.Model):
    building_id = models.AutoField('ID', auto_created=True, primary_key=True)
    name        = models.CharField('Name', max_length=125, null=True, blank=False, unique=False)
    address     = models.CharField('Address', max_length=256, null=False, blank=False)
    user_id     = models.ForeignKey('accounts.User', on_delete=models.CASCADE, default=1)

    def __str__(self):
        return self.name
class BuildingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Building
        fields = ('building_id', 'name', 'address', 'user_id')
from django_filters.rest_framework import DjangoFilterBackend

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'address']
型号.py

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
class Building(models.Model):
    building_id = models.AutoField('ID', auto_created=True, primary_key=True)
    name        = models.CharField('Name', max_length=125, null=True, blank=False, unique=False)
    address     = models.CharField('Address', max_length=256, null=False, blank=False)
    user_id     = models.ForeignKey('accounts.User', on_delete=models.CASCADE, default=1)

    def __str__(self):
        return self.name
class BuildingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Building
        fields = ('building_id', 'name', 'address', 'user_id')
from django_filters.rest_framework import DjangoFilterBackend

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'address']
序列化程序.py

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
class Building(models.Model):
    building_id = models.AutoField('ID', auto_created=True, primary_key=True)
    name        = models.CharField('Name', max_length=125, null=True, blank=False, unique=False)
    address     = models.CharField('Address', max_length=256, null=False, blank=False)
    user_id     = models.ForeignKey('accounts.User', on_delete=models.CASCADE, default=1)

    def __str__(self):
        return self.name
class BuildingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Building
        fields = ('building_id', 'name', 'address', 'user_id')
from django_filters.rest_framework import DjangoFilterBackend

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'address']
url.py

router = DefaultRouter()
router.register(r'buildings', views.APIBuildingsViewSet, base_name='buildings')

urlpatterns = [
    url(r'^api/', include(router.urls)),
]

您需要在视图中使用
DjangoFilterBackend
,并指定可用于筛选的字段

首先,您必须使用
pip install django filter
安装它,并将
django_filters
添加到
settings.py/INSTALLED_APPS
,并按如下方式设置视图:

...
from django_filters.rest_framework import DjangoFilterBackend

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = (building_id, name, address, user_id)

通过这些设置,您可以发送一篇文章,如
/api/buildings/?name=hospital
(注意问号前的斜线)

您需要在视图中使用
DjangoFilterBackend
,并指定可用于筛选的字段

首先,您必须使用
pip install django filter
安装它,并将
django_filters
添加到
settings.py/INSTALLED_APPS
,并按如下方式设置视图:

...
from django_filters.rest_framework import DjangoFilterBackend

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = (building_id, name, address, user_id)

通过这些设置,您可以发送一篇文章,如
/api/buildings/?name=hospital
(注意问号前的斜杠)

只需在view.py文件中进行更改即可

视图.py

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
class Building(models.Model):
    building_id = models.AutoField('ID', auto_created=True, primary_key=True)
    name        = models.CharField('Name', max_length=125, null=True, blank=False, unique=False)
    address     = models.CharField('Address', max_length=256, null=False, blank=False)
    user_id     = models.ForeignKey('accounts.User', on_delete=models.CASCADE, default=1)

    def __str__(self):
        return self.name
class BuildingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Building
        fields = ('building_id', 'name', 'address', 'user_id')
from django_filters.rest_framework import DjangoFilterBackend

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'address']

只需在view.py文件中进行更改即可

视图.py

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
class Building(models.Model):
    building_id = models.AutoField('ID', auto_created=True, primary_key=True)
    name        = models.CharField('Name', max_length=125, null=True, blank=False, unique=False)
    address     = models.CharField('Address', max_length=256, null=False, blank=False)
    user_id     = models.ForeignKey('accounts.User', on_delete=models.CASCADE, default=1)

    def __str__(self):
        return self.name
class BuildingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Building
        fields = ('building_id', 'name', 'address', 'user_id')
from django_filters.rest_framework import DjangoFilterBackend

class APIBuildingsViewSet(viewsets.ModelViewSet):
    queryset = Building.objects.all()
    serializer_class = BuildingSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'address']