首页 > 解决方案 > Django - 从扩展用户模型中获取字段的查询集

问题描述

我有扩展用户的模型配置文件,我想“加入”用户模型以从中获取一些字段。我知道它不会加入,因为 Profile 是 User 的扩展,但我不确定如何使它工作。感谢您对此的任何帮助。

基本上,目标是从用户和配置文件中获取这些字段:用户名(来自用户)last_login(来自用户),last_activity(来自配置文件)以我视图的查询集形式。

模型.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    last_activity = models.DateTimeField(null=True, blank=True)

    def __str__(self):
        return self.user.username

序列化程序.py

class ProfileSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=True)  # <- this part not correct, but not sure how to treat User model here

    class Meta:
        model = Profile
        fields = ('__all__')

视图.py

class ProfileList(ListAPIView):
    queryset = Profile.objects.values('id', 'user__username', 'user__last_login', 'last_activity')  # <- this isn't right, not sure what would be the correct way
    serializer_class = ProfileSerializer

标签: pythondjangodjango-queryset

解决方案


您可以将其添加到models.py

    from django.db.models.signals import post_save
    from django.dispatch import receiver

    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
        last_activity = models.DateTimeField(null=True, blank=True)
    
        def __str__(self):
            return self.user.username
       
        @receiver(post_save, sender=User)
        def create_user_profile(sender, instance, created, **kwargs):
          if created:
            Profile.objects.create(user=instance)
    
        @receiver(post_save, sender=User)
        def save_user_profile(sender, instance, **kwargs):
            instance.profile.save()

如果您想更改views.py中的某些内容,这是一个示例,您可以如何做到这一点:

   from datetime import datetime
    def update_profile(request, user_id):
        user = User.objects.get(pk=user_id)
        user.profile.last_activity = datetime.now()
        user.save()

我这对你有帮助


推荐阅读