2017-02-22 19 views
0

私の 'Sample'モデルに 'tests'フィールドを追加します。ここで 'tests'は 'TestRequest'オブジェクトのリストになります。現在、このエラーが発生しています:Django Restful:ネストされたシリアライザ

Got AttributeError when attempting to get a value for field `tests` on serializer `SampleSerializer`. 
The serializer field might be named incorrectly and not match any attribute or key on the `Sample` instance. 
Original exception text was: 'Sample' object has no attribute 'tests'. 

'tests'は私のモデルのフィールドではありません。私はそれをシリアル化されたデータに追加しようとしています。現在、ネストされたシリアライザを 'klass'で動作させることができますが、これはモデルで定義されているためです。

モデル:

class Sample(models.Model): 
    name = models.CharField(max_length=50, null=False, blank=False) 
    comments = models.TextField(null=True, blank=True) 
    klass = models.ForeignKey('samples.Batch', null=True, blank=True, 
     related_name='samples', verbose_name='Batch') 
    product = models.ForeignKey('customers.Product', blank=False) 

    NOTRECEIVED = 'nr' 
    RECEIVED = 'rc' 
    DISCARDED = 'dc' 
    DEPLETED = 'dp' 

    SAMPLE_STATUS = (
     (NOTRECEIVED, 'not received'), 
     (RECEIVED, 'received'), 
     (DISCARDED, 'discarded'), 
     (DEPLETED, 'depleted'), 
    ) 

    status = models.CharField(
     max_length=2, choices=SAMPLE_STATUS, default=NOTRECEIVED) 
    is_recycling = models.BooleanField(default=False) 
    is_submitted = models.BooleanField(default=False) 

    received_date = models.DateTimeField(
     _('date received'), null=True, blank=True) 


class TestRequest(models.Model): 
     client = models.ForeignKey('customers.Client') 
     company = models.ForeignKey('customers.Company') 
     sample = models.ForeignKey('samples.Sample') 
     procedure_version = models.ForeignKey('registery.ProcedureVersion') 
     replicates = models.PositiveIntegerField(editable=True, null=True, blank=True) 
     created_date = models.DateTimeField('Date created', auto_now_add=True) 
     last_updated = models.DateTimeField(auto_now=True) 
     comments = models.TextField('Comments', blank=True) 

シリアライザ:

class TestSerializer(serializers.ModelSerializer): 
    href = serializers.HyperlinkedIdentityField(lookup_field='pk', lookup_url_kwarg='pk', read_only=True, view_name='samples_api:test-detail') 

    class Meta: 
     model = TestRequest 
     fields = ('id', 'href',) 

class SampleBatchSerializer(serializers.ModelSerializer): 
    href = serializers.HyperlinkedIdentityField(
     lookup_field='pk', lookup_url_kwarg='batch_pk', read_only=True, view_name='samples_api:batch-detail') 

    class Meta: 
     model = Batch 
     fields = ('id', 'href',) 

class SampleSerializer(serializers.ModelSerializer): 
    tests = TestSerializer(many=True) 
    klass = SampleBatchSerializer(many=False) 

    class Meta: 
     model = Sample 
     # list_serializer_class = FilteredListSerializer 
     fields = ('id', 'name', 'tests', 'klass',) 

    def create(self, validated_data): 
     ... 

    def update(self, instance, validated_data): 
     ... 

ビューセット:

class TestRequestViewSet(viewsets.ModelViewSet): 
    """ 
    Viewset for the TestRequest model 
    """ 
    serializer_class = TestRequestSerializer 

    def get_queryset(self): 
     client = get_object_or_404(Client, user=self.request.user) 
     return TestRequest.objects.filter(company=client.company) 

    def perform_create(self, serializer): 
     # Override default creatation to provide request based information. 
     client = get_object_or_404(Client, user=self.request.user) 
     company = client.company 
     serializer.save(client=client, company=company) 

class SampleViewSet(viewsets.ModelViewSet): 
    """ 
    Viewset for the Sample model 
    """ 
    serializer_class = SampleSerializer 

    def get_queryset(self): 
     client = get_object_or_404(Client, user=self.request.user) 
     return Sample.objects.filter(klass__company=client.company) 

私はむしろモデルにフィールドを追加する必要はありません。 'Sample'は多くの 'TestRequest'を持つことができますが、 'TestRequest'は 'Sample'を1つしか持てません。

シリアライザにモデルに含まれていない「テスト」フィールドを追加するにはどうすればよいですか?

答えて

0

SampleSerializerあなたは、モデル内のあなたのSampleクラスではありません「tests」...以下のように

使用ネストされたSerializerMethodField ....

tests = serializers.SerializerMethodField() 

def get_tests(self, obj): 

    var=TestRequestSerializer(obj.id) 
    return var.data 
を指定しています
関連する問題