2017-05-23 43 views
-1

私はジャンゴで、このようなURL: url(r'^data/$', views.DataList)や見解を持っている:Djangoでビューを改善するにはどうすればよいですか?

@api_view(['GET', 'POST']) 
def DataList(request): 
    try: 
     myData = Data.objects.filter(sth=request.GET.get('sth')) 
     if request.method == 'GET': 
      serializer = DataSerializer(myData, many=True) 
      return Response(serializer.data) 

    except Data.DoesNotExist: 
     if request.method == 'GET': 
      myData = Data.objects.all() 
      serializer = DataSerializer(myData, many=True) 
      return Response(serializer.data) 
     elif request.method == 'POST': 
      serializer = DataSerializer(data=request.data) 
      if serializer.is_valid(): 
       serializer.save() 
       return Response(serializer.data, status=status.HTTP_201_CREATED) 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

私の問題は、私はURL http://localhost:8000/data/を持っており、例えば、これは達成していない私の見解を要求し得るとき:

if request.method == 'GET': 
    myData = Data.objects.all() 
    serializer = DataSerializer(myData, many=True) 
    return Response(serializer.data) 

それはように見えますこの場合、try-exceptは良い解決策ではなく、これが問題の原因です。私はそれを解決する最善の方法は何ですか? ソリューション:

@api_view(['GET', 'POST']) 
def DataList(request): 
    if request.method == "POST": 
     serializer = DataSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     else: 
      return Response(serializer.errors) 
    elif request.GET.get('sth',False): 
     sth = request.GET.get('sth', '') 
     object = Object.objects.filter(sth=sth) 
    else: object = Object.objects.all() 
    serializer = ObjectSerializer(object, many=True) 
    return Response(serializer.data) 

答えて

1

理由

@api_view(['GET', 'POST']) 
def DataList(request): 
    if request.method == "POST": 
     serializer = DataSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     else: 
      return Response(serializer.errors) 
    else: 
     try: 
      sth = request.GET['sth'] 
      myData = Data.objects.filter(sth=sth) 
     except: 
      myData = Data.objects.all() 
     serializer = DataSerializer(myData, many=True) 
    return Response(serializer.data) 

EDIT、なぜなら試す-除き省略は、それがどんな結果が見つからなかった場合objects.filter関数は空のクエリセットを返すということです。したがって、例外は発生しません。しかし、空のクエリセットのif文を使用すると、Falseが返されます。だから、より効率的な状況になるだろう。

+0

この場合、myData = Data.objects.all()は達成されません。 – wahtdbogh

+0

コードを更新しました。「Data.DoesNotExist」を除く必要はありませんでしたが、トリックを行う必要はありません。 – zaidfazil

+0

クエリーセットフィルタはModel.DoesNotExistエラーを発生させないため実際にはビューは決して除外部分に届きません。空のクエリーセット... – zaidfazil

関連する問題