簡體   English   中英

Django - 從擴展用戶模型中獲取字段的查詢集

[英]Django - Queryset to get fields from extended User model

我有擴展 User 的模型 Profile,我想“加入” User 模型以從中獲取一些字段。 我知道它不會加入,因為 Profile 是 User 的擴展,但我不確定如何使其工作。 感謝您對此的任何幫助。

基本上,目標是從 User 和 Profile 獲取這些字段: username(來自 User)last_login(來自 User),last_activity(來自 Profile)以查詢集的形式供我查看。

模型.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

您可以將其添加到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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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