簡體   English   中英

Django - 如何注釋單個 Django object

[英]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.serializeavatar作為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM