2017-08-30 5 views
0

django-rest-frameworkの新機能です。私はdriftとfrontendを使ってREST APIを構築した従業員スケジューリングアプリケーションを構築しています。以下は私のモデルの1つで、それは対応するシリアライザとビューセットです。django-rest-frameworkで警告メッセージを追加する

モデル:

class Eventdetail(models.Model): 
    event = models.ForeignKey(Event, models.DO_NOTHING, blank=True, null=True) 
    start = models.DateTimeField(blank=True, null=True) 
    end = models.DateTimeField(blank=True, null=True) 
    employee = models.ForeignKey(Employee, models.DO_NOTHING, blank=True, null=True) 
    location = models.ForeignKey(Location, models.DO_NOTHING, blank=True, null=True) 
    is_daily_detail = models.BooleanField 

    def __str__(self): 
     return self.event 

シリアライザ:

class LocationTrackSerializer(serializers.ModelSerializer): 

    def __init__(self, *args, **kwargs): 
     many = kwargs.pop('many', True) 
     super(LocationTrackSerializer, self).__init__(many=many, *args, **kwargs) 

    location = serializers.SlugRelatedField(slug_field='location_name', queryset=Location.objects.all()) 
    location_color = serializers.CharField(source='location.location_color', read_only=True) 

    class Meta: 
      model = Eventdetail 
      fields = ('id','employee','location','location_color','start','end') 

ビューセット:

class LocationTrackViewSet(viewsets.ModelViewSet): 
    queryset = Eventdetail.objects.all() 
    serializer_class = LocationTrackSerializer 

    def create(self, request, *args, **kwargs): 
     self.user = request.user 
     listOfThings = request.data['events'] 

     serializer = self.get_serializer(data=listOfThings, many=True) 
     if serializer.is_valid(): 
      serializer.save() 
      headers = self.get_success_headers(serializer.data) 
      return Response(serializer.data, status=status.HTTP_201_CREATED, 
         headers=headers) 

     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

あなたが見ることができるように、これはすべての従業員のイベントの詳細を公開しています。新しいイベントが投稿されると、投稿されたイベントの開始時刻と終了時刻が既存のイベントと重複しているかどうかを確認し、作成後に重複したイベントの情報を含む警告メッセージを表示する必要があります。私はまだ保存を許可したいが、保存後に警告を返すだけである。私はこれを行う方法を理解しようとしています。私はバリデータを作成する方法を見ていましたが、もしこれがどうすればいいのか分かりません。どんな助けもありがとう!ありがとう。次のように

+0

あなたは警告とはどういう意味ですか?シリアライザのデータと一緒に追加のデータは、それですか? –

+0

@SachinKukreja申し訳ありませんが、それは私が意味するものです。新たに通知されたイベントが既存のイベントと重複する日付を有する場合、「既存のイベントと重複する」というメッセージフィールドは、 – ash

答えて

0

あなたはシリアライザにフィールドwarning_messageを追加することができます -

class LocationTrackSerializer(serializers.ModelSerializer): 
    # rest of the code 

    def get_warning_message(self, obj): 
     warning_msg = '' 

     # logic for checking overlapping dates 
     # create a method `are_dates_overlapping` which takes 
     # start and end date of the current obj and checks with all 
     # others in queryset. 
     overlap = are_dates_overlapping(obj.start, obj.end) 
     if overlap: 
      warning_msg = 'overlaps' 

     return warning_msg 

    warning_message = serializers.SerializerMethodField(read_only=True) 

    class Meta: 
     model = Eventdetail 
     fields = ('id','employee','location','location_color','start','end', 'warning_message') 

参考:Serializer Method Field in DRF

関連する問題