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")
我有 扩展 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")