Как отобразить только определенные данные из всего хранилища списков на сервере Python Django (остальные рамки) - PullRequest
0 голосов
/ 14 сентября 2018

Я должен отображать (как в заголовке темы) только определенные данные из списка, который хранится на сервере (PYTHON / DJANGO / REST_FRAMEWORK).

F.e. Я хочу выбрать данные, которые были посажены на сервер с 'id = 1', но я всегда получаю обратно все элементы. Можете ли вы объяснить, как это исправить?

файл 'urls' (уровень проекта):

# URL routes - known as endpoints API
urlpatterns = [
    path('admin/', admin.site.urls),
    path('devices/', include('efota.api.urls')),
]

Файл 'urls' (подчиненная папка):

urlpatterns = [
    url('', views.DeviceList.as_view()),
    url('<int:pk>/', views.DeviceDetail.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns)

Файл 'views':

class DeviceList(generics.ListAPIView):
    queryset = Device.objects.all()  
    serializer_class = DeviceSerializer 

class DeviceDetail(generics.RetrieveAPIView):
    queryset = Device.objects.all()      
    serializer_class = DeviceSerializer  

Файл 'сериализаторов':

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

    # the 'fields' controls which database attributes are available
    class Meta:
        model = Device
        fields = (
            'id',
            'user',
            'id_token',
            'current_firmware',
            'carrier_code',
            'model_name',
            'owner',
        )
        read_only_fields = ['id']


    def get_url(self, obj):
        request = self.context.get("request")
        return obj.get_api_url(request=request)

файл "моделей":

class Device(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey('auth.User', related_name='owner', 
            on_delete=models.CASCADE)
    user = models.CharField(max_length=50, verbose_name='user')
    id_token = models.CharField(max_length=1000, 
            verbose_name='id_token')
    current_firmware = models.CharField(max_length=41, 
           verbose_name='current_firmware')
    carrier_code = models.CharField(max_length=5, 
           verbose_name='carrier_code')
    model_name = models.CharField(max_length=10, 
           verbose_name='model_name')

    class Meta:
        ordering = ('created', )


    def __str__(self):
        return self.model_name

Файл 'admin':

from django.contrib import admin
from .models import Device

# Register your models here.
admin.site.register(Device)

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Чтобы отфильтровать результат, возвращаемый ListAPIView, вы можете изменить его метод get_queryset следующим образом.

class DeviceDetail(generics.ListAPIView):
    serializer_class = DeviceSerializer

    def get_queryset(self):
        return Device.objects.filter(id=self.kwargs['pk'])
0 голосов
/ 14 сентября 2018

Вы путаете URL старого стиля и синтаксис пути нового стиля в вашем urls.py.Функция url() принимает регулярное выражение, а r'' соответствует каждому URL, тогда как <int:pk>/ будет соответствовать только этой буквенной строке .Вместо этого используйте path.

urlpatterns = [
    path('', views.DeviceList.as_view()),
    path('<int:pk>/', views.DeviceDetail.as_view()),
]
...