[英]Django - How to annotate a single Django object
所以 Django 有这个很酷的功能,您可以在其中注释查询集,因为您可以为查询集中的每个 object 添加属性。 例如,如果我有一个用户查询集,我可以用关注者数量对其进行注释,这是另一个具有对用户的外键引用的表。 这可以通过QuerySet.annotate()
function 来完成。 我想知道这对于单个 Django object 是否可行。 我有一个获取用户信息的视图 function,它给定一个唯一的用户 UUID,我返回用户表中的用户信息以及关注者和关注者的数量。 一种方法是在所有关注者和关注者表中查询 uuid 并创建一个返回的字典。 或者创建一个包含所有字段的序列化程序,而不是像使用查询集一样注释单个 Django object。 是否有可能做到这一点?
视图.py
@api_view(['GET'])
def get_user_info(request, user_uuid):
is_current_user = user_uuid == str(request.user.uuid)
# Return all user info including # of followers and followees
模型.py
class User(AbstractDatesModel):
uuid = models.UUIDField(primary_key=True)
username = models.CharField(max_length=USERNAME_MAX_LEN, unique=True, validators=[
MinLengthValidator(USERNAME_MIN_LEN)])
created = models.DateTimeField('Created at', auto_now_add=True)
updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
avatar = models.ImageField(upload_to=avatar_directory_path, blank=True, null=True)
class FollowUser(AbstractSimpleModel):
follower = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='follower_id')
followee = models.ForeignKey(
User, on_delete=models.CASCADE, related_name='followee_id')
我在views2.py
中试过这个,但问题是它不能正确返回头像 url。 serializer.serialize
将avatar
作为ImageFieldFile
保存在序列化用户 object 中。
意见2.py
@api_view(['GET'])
def get_user_info(request, user_uuid):
is_current_user = user_uuid == str(request.user.uuid)
if is_current_user:
user_object = request.user
else:
try:
user_object = User.objects.get(uuid=user_uuid)
except User.DoesNotExist as e:
return Response(dict(error=str(e),
user_message='User does not exist.'),
status=status.HTTP_404_NOT_FOUND)
user_dict = model_to_dict(user_object)
user_dict['follower_count'] = len(FollowUser.objects.filter(followee=user_uuid))
user_dict['followee_count'] = len(FollowUser.objects.filter(follower=user_uuid))
user_dict['is_following'] = FollowUser.objects.filter(followee=user_uuid, follower=str(request.user.uuid)).exists()
return Response(user_dict, status=status.HTTP_200_OK)
@api_view(['GET'])
def get_user_info(request, user_uuid):
query = User.objects.filter(pk=user_uuid)
if query.exists():
query_annotated = query.annotate(
follower_count=Count('followee_id', distinct=True),
followee_count=Count('follower_id', distinct=True),
is_following=Count('followee_id', filter=Q(follower_id=str(request.user.uuid))))
else:
return Response(dict(error=str('User not found.'),
user_message='User not found.'),
status=status.HTTP_404_NOT_FOUND)
serializer = FullUserSerializer(query_annotated[0])
return Response(serializer.data, status=status.HTTP_200_OK)
也许是一个解决方案? 但是is_following
在我的测试中没有返回正确的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.