Django - 从扩展用户模型中获取字段的查询集

Django - Queryset to get fields from extended User model

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

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

models.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

serializers.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__')

views.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

您可以将此添加到 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()

我希望这对你有帮助

def profile(request):
    profile = Profile.objects.get(user=request.user)
    username = profile.user.username
    last_login = profile.user.last_login
    last_activity = profile.last_activity
    return render(request, "user.html")