分类 python 下的文章

model

from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, default=None, verbose_name='用户')
    name_show = models.CharField(max_length=50, null=False, blank=False, verbose_name='用户昵称')
    avatar = models.ImageField(upload_to='image/', null=True, blank=True, verbose_name='头像',
                               default='image/avatar.png')
    follow_count = models.IntegerField(verbose_name='粉丝数', default=0)
    like_count = models.IntegerField(verbose_name='点赞数', default=0)
    view_count = models.IntegerField(verbose_name='浏览数', default=0)
    collect_count = models.IntegerField(verbose_name='收藏数', default=0)
    article_count = models.IntegerField(verbose_name='文章数', default=0)
    introduction = models.CharField(max_length=100, null=False, blank=False, verbose_name='用户简介',
                                    default='这个人很懒,什么都没有留下')
    department = models.CharField(max_length=100, null=True, blank=True, verbose_name='部门', default='')
    created_at = models.DateTimeField(verbose_name='创建时间', editable=False, null=False, default=timezone.now)
    updated_at = models.DateTimeField(verbose_name='更新时间', editable=False, null=False, auto_now=True)

  
    def __str__(self):
        return self.name_show

    class Meta:
        verbose_name = "资料"
        verbose_name_plural = verbose_name

admin

from django.contrib import admin
from .models import *
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User


class ProfileAdmin(admin.StackedInline):
    model = Profile

    list_display = (
        'id', 'user', 'avatar', 'avatar_tag', 'follower_count', 'like_count', 'collect_count', 'article_count')


class UserAdmin(UserAdmin):
    list_display = (
        'id', 'username', 'avatar_tag', 'email', 'is_staff', 'is_active', 'is_superuser', 'date_joined', 'last_login')
    inlines = (ProfileAdmin,)

    def avatar_tag(self, obj):
        return obj.profile.avatar_tag()


# admin.site.register(Profile, ProfileAdmin)
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

model

class Video(models.Model):
    view_count = models.IntegerField(verbose_name='浏览量', default=0)
    like_count = models.IntegerField(verbose_name='点赞量', default=0)
    collect_count = models.IntegerField(verbose_name='收藏量', default=0)
    comment_count = models.IntegerField(verbose_name='评论量', default=0)
    # 忽略其他字段

view

from django.db.models import Sum, Count

data = Video.objects.aggregate(
        count=Count('id'),
        view_count=Sum('view_count'),
        like_count=Sum('like_count'),
        collect_count=Sum('collect_count'),
        comment_count=Sum('comment_count')
    )

获取登录用户有两种方式

1.中间件
2.request.user

1.中间件

from threading import local

_user = local()


class CurrentUserMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        _user.value = request.user
        response = self.get_response(request)
        return response

    @staticmethod
    def get_current_user():
        return getattr(_user, 'value', None)

setting中

MIDDLEWARE = [
    # ...
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    #...
    #需要在 auth中间件后面
    "backend.middleware.CurrentUserMiddleware",
]

使用

form .middleware import CurrentUserMiddleware

user = CurrentUserMiddleware.get_current_user()

# model中使用
class MyModel(models.Model):
    creator = models.ForeignKey(User, on_delete=models.SET_NULL, verbose_name='创建人',
                               related_name='creator', null=True, blank=True, )

    def save(self, *args, **kwargs):
        if not self.pk and not self.author:
            self.author = CurrentUserMiddleware.get_current_user()
        super().save(*args, **kwargs)

2.request

@api_view(["GET"])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def tag_create(request):
    user=request.user