私はdjango1.11を使用しています:
モデル:
class Model(models.Model):
.
.
.
def count_total(self):
return self.anothermodel_set.filter(val=False).count()
見る:
class ModelViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Model.objects.all()
serializer_class = ModelSerializerClass
permissions = AuthenticatedReadOnly
pagination_class = StandardResultsSetPagination
def list(self, request):
queryset = Model.objects.all()
# Attempt 1: returns wrong count
queryset = queryset.annotate(a_count=Count(Case(When(anothermodel__val=False, then=1), default=0, output_field=IntegerField())))
# Attempt 2: returns wrong count, same as attempt 1
queryset = queryset.annotate(b_count=Count(Q(anothermodel__val=False)))
# ideally I want to do
queryset = queryset.order_by('count_total')
それで注文するときcount_total
はあげます
/ api / endpoint /のFieldErrorキーワード「count_total」をフィールドに解決できません。
シリアライザー:
私のシリアライザーではto_represantation
、デバッグするように定義を変更しました。
def to_representation(self, instance):
return {'id': instance.pk, 'a_count': instance.a_count, 'b_count' : instance.b_count, 'correct_count': instance.count_total()}
それ以外の場合、私のシリアライザーには次のものがあります。
class Meta:
model = Model
fields = ('id', 'title', 'bunch-of-other-stuff', 'count_total')
instance.count_total()
正しい結果を返しますが、私は単にそれを使用することはできませんqueryset.order_by('count_total')
注釈なしの結果を注文する点で好ましいです。
ここで何が悪いのか考えはありますか?
これが問題かどうかはわかりませんが、値を返さず、計算を行うだけなので、モデル定義は未使用のように見えます。そのはず:
def count_total(self):
return self.anothermodel_set.filter(val=False).count()
モデルとビューの両方で計算が行われる理由についても混乱しています。モデル定義を使用するか、クエリセットに注釈を付けますが、両方を行う必要はありません。モデル定義ルートに進むと、ビューは次のようになります。
class ModelViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Model.objects.all()
serializer_class = ModelSerializer
permissions = AuthenticatedReadOnly
pagination_class = StandardResultsSetPagination
def list(self, request):
queryset = self.queryset.order_by('count_total')
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
モデル定義を使用する場合は、シリアライザーでread_only属性のようなものを設定する必要があります。
count_total = serializers.ReadOnlyField(allow_null=True)
class Meta:
model = Model
fields = ('id', 'title', 'bunch-of-other-stuff', 'count_total')
それでも「カウント合計をフィールドに解決できない」エラーが発生する場合は、次のようにシリアライザーを実行する前に、印刷ステートメントをビューセットにスローします。
print(str(queryset))
問題は、モデル定義をどのようにフィルタリングしているかにある可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加