我想呼叫從嵌套序列化程式子項的視圖中預取的查詢集。我嘗試了以下操作,但沒有按照我的預期作業。如何從子序列化程式呼叫預取的查詢集?
#models.py
class User(AbstractBaseUser, PermissionsMixin):
...
#This is allauth.models
class EmailAddress(models.Model):
user = models.ForeignKey(
allauth_app_settings.USER_MODEL,
verbose_name=_("user"),
on_delete=models.CASCADE,
)
verified = models.BooleanField(verbose_name=_("verified"), default=False)
#views.py
class PlaylistListView(generics.ListAPIView):
serializer_class = PlaylistSerializer
def get_queryset(self):
return (
Playlist.objects.all()
.prefetch_related("user", "user__emailaddress_set")
)
#serializers.py
class UserDetailSerializer(serializers.ModelSerializer):
is_verified = serializers.SerializerMethodField()
class Meta:
model = User
fields = ("is_verified",)
def get_is_verified(self, user):
return user.emailaddress_set.filter(verified=1).count() > 0 # <- here
class PlaylistSerializer(serializers.ModelSerializer):
user = UserDetailSerializer(read_only=True)
class Meta:
model = Playlist
fields = ("user",)
函式 max(boolean) 不存在:錯誤影像
uj5u.com熱心網友回復:
我們可以使用一個Prefetch物件來預取帶有注釋的用戶,它是否被驗證,verified似乎是一個布林值,所以如果任何相關的電子郵件被驗證,選擇Max將給我們True。在序列化器中,我們可以查找這個注解,如果存在則回傳它,否則回傳與之前相同的內容
from django.db.models import Prefetch, Max
class PlaylistListView(generics.ListAPIView):
serializer_class = PlaylistSerializer
def get_queryset(self):
return Playlist.objects.prefetch_related(
Prefetch('user', queryset=User.objects.annotate(_is_verified=Max('emailaddress__verified')))
)
class UserDetailSerializer(serializers.ModelSerializer):
is_verified = serializers.SerializerMethodField()
class Meta:
model = User
fields = ("is_verified",)
def get_is_verified(self, user):
if hasattr(user, "_is_verified"):
return user._is_verified
else:
return user.emailaddress_set.filter(verified=True).exists()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/322279.html
