2016-10-28 4 views
0

以下のクエリ(query1)に基づいてdjangoシェルで以下の結果(result1)を返すモデル(model.py)があり、正常に動作します。私の目的はDjango Rest APIを使って同じクエリーセットを返すことですが、これを実現するためにクラスへのシリアライズの操作方法はわかりません。私は、それぞれのユーザー、この場合はラントター、各タスクを返すことができなくなっています。下のビュークラス(view1.py)と私の現在のシリアライズクラス(serialize.py)に基づいて、これまでの結果(result2)を返すことができました。任意の助けを大幅Django RESTフレームワークを使用してManyToManyとForeignKeyの関係をシリアル化する方法

model.py

class Task(models.Model): 
    task_name = models.CharField(max_length=200) 

    def __str__(self): 
     return self.task_name 



@python_2_unicode_compatible # only if you need to support Python 2 
class Space(models.Model): 
    space_name = models.CharField(max_length=200) 
    task = models.ManyToManyField(Task) 

    def __str__(self): 
     return str(self.space_name) 

@python_2_unicode_compatible # only if you need to support Python 2 
class Room(models.Model): 
    building = models.ForeignKey(Building, on_delete = models.CASCADE) 
    room_name = models.CharField(max_length=200) 
    rmfloor_name = models.ForeignKey(Floor, on_delete = models.CASCADE) 
    sqfootage = models.IntegerField() 
    spacetype = models.ForeignKey(Space, on_delete = models.CASCADE) 
    barcode_name = models.CharField(max_length=100) 


    def __str__(self): 
     return self.room_name 

@python_2_unicode_compatible # only if you need to support Python 2 
class Schedule(models.Model): 
    building = models.ForeignKey(Building, on_delete = models.CASCADE) 
    schedule_name = models.CharField(max_length=200) 
    user = models.ForeignKey(User) 

    def __str__(self): 
     return self.schedule_name 

Query1を

s1 = Schedule.objects.get(pk=1) 
r1 = Room.objects.get(pk=2) 
sp1 = r1.spacetype.pk 
s = Space.objects.get(pk = sp1) 
task_queryset = s.task.all() 
for tq in task_queryset: 
    print tq.pk, tq.task_name, x.schedule.user.username 

結果1

1 Remove large debris from floor  rhunter 
2 Clean walls and horizontal surfaces rhunter 
3 Clean touch points     rhunter 
4 Empty trash container     rhunter 
6 Spot clean desks/furniture   rhunter 
7 High/Low dust       rhunter 

view1.py

class TaskListMixin(object): 
    s1 = Schedule.objects.get(pk=1) 
    r1 = Room.objects.get(pk=2) 
    sp1 = r1.spacetype.pk 
    s = Space.objects.get(pk = sp1) 
    queryset = s.task.all() 
    serializer_class = SimpleSerializer3 
    permission_classes = (permissions.IsAuthenticated,) 

class TaskListViewSet(TaskListMixin, generics.BulkModelViewSet): 
    pass 
を理解されるであろう

serialize.py

class SimpleSerializer3(BulkSerializerMixin, ModelSerializer): 



class Meta(object): 
    model = Task 
    list_serializer_class = BulkListSerializer 
    fields = ('pk', 'task_name') 

はresults2

[ 
{ 
    "pk": 1, 
    "task_name": "Remove large debris from floor" 
}, 
{ 
    "pk": 2, 
    "task_name": "Clean walls and horizontal surfaces" 
}, 
{ 
    "pk": 3, 
    "task_name": "Clean touch points" 
}, 
{ 
    "pk": 4, 
    "task_name": "Empty trash container" 
}, 
{ 
    "pk": 6, 
    "task_name": "Spot clean desks/furniture" 
}, 
{ 
    "pk": 7, 
    "task_name": "High/Low dust" 
} 

]

答えて

0

公式ドキュメント読んでいるあなたの問題を解決する最良の方法: http://www.django-rest-framework.org/api-guide/relations/

をしかし、私はあなたを与えるだろうあなたのコードに基づく例 私があなただったら、私は

マイmodel.py

@python_2_unicode_compatible # only if you need to support Python 2 
class Task(models.Model): 
    task_name = models.CharField(max_length=200) 

    def __str__(self): 
     return self.task_name 

@python_2_unicode_compatible # only if you need to support Python 2 
class Schedule(models.Model): 
    building = models.ForeignKey(Building, on_delete = models.CASCADE) 
    schedule_name = models.CharField(max_length=200) 
    user = models.ForeignKey(
     User, 
     null=True, 
     blank=True, 
     editable=False, 
     on_delete=models.SET_NULL 
    ) 

    def __str__(self): 
     return self.schedule_name 

@python_2_unicode_compatible # only if you need to support Python 2 
class Space(models.Model): 
    space_name = models.CharField(max_length=200) 
    task = models.ManyToManyField(Task) 
    # Look at this new field... 
    schedule = models.ForeignKey(Schedule, 
     null=True, 
     blank=True, 
     on_delete = models.SET_NULL) 

    def __str__(self): 
     return str(self.space_name) 

@python_2_unicode_compatible # only if you need to support Python 2 
class Room(models.Model): 
    building = models.ForeignKey(Building, on_delete = models.CASCADE) 
    room_name = models.CharField(max_length=200) 
    rmfloor_name = models.ForeignKey(Floor, on_delete = models.CASCADE) 
    sqfootage = models.IntegerField() 
    spacetype = models.ForeignKey(Space, on_delete = models.CASCADE) 
    barcode_name = models.CharField(max_length=100) 


    def __str__(self): 
     return self.room_name 

マイview.py

...私が欲しいものを達成するために私のコードのロジックを見直します
class SpaceViewSet(ModelViewSet): 
    serializer_class = SpaceSerializer 
    queryset = Space.objects.all() 

My serialiser.py

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = (
      'id', 
      'username' 
     ) 

class ScheduleSerializer(serializers.ModelSerializer): 
    user = UserSerializer(read_only=True, many=False) 
    class Meta: 
     model = Schedule 
     fields = (
      'id', 'schedule_name', 'user' 
     ) 


class TaskSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Task 
     fields = (
      'id', 'task_name' 
     ) 


class SpaceSerializer(serializers.ModelSerializer): 
    task = TaskSerializer(read_only=True, many=True) 
    schedule = ScheduleSerializer(read_only=True, many=False) 
    class Meta: 
     model = Space 
     fields = (
      'id', 'space_name', 'task', 'schedule' 
     ) 

そして最後に私の結果はこのようなものである必要があります。この例は、あなたが望むものに準拠していない場合は、

{ 
    "id": 1, 
    "space_name": "Hello World", 
    "task": [ 
     { 
      "id": 1, 
      "task_name": "Hello" 
     } 
    ], 
    "schedule": { 
     "id": 1, 
     "schedule_name": "my schedule name", 
     "user": { 
      "id": 1, 
      "username": "admin" 
     } 
    } 
}, 

それが行くと探し続ける聞かせて...

関連する問題