django objects.get 使用id or pk

在使用django操作model的时候经常会用到根据id来查找某个对象,我们在官网上看到的是使用get(pk=1)这个方法,比如说:

Student.objects.get(pk=1)

但是我们还可以通过用另外一个方法得到相同的结果:

Students.objects.get(id=1)

还有一种情况能够说明这一点,那就是在StudentAdmin里面有一个字段叫做list_display,相当于table里面的th,

我们可以这样写

list_display = ['pk', 'name‘, 'age']

 当但也可以写成:

list_display = ['id', 'question', 'pub_date']

 结果显示都是它的主键的值

 

那么这里面pk和id有什么不同和相同之处呢?

 

其实大部分情况来说pk和id是一样的,我们知道pk代表primary key的缩写,也就是任何model中都有的主键,那么id呢,大部分时候也是model的主键,所以在这个时候我们可以认为pk和id是完全一样的。

但是有时候不一样?什么时候?是的,你猜到了,当model的主键不是id的时候,这种情况虽然少,但是django为我们想到了,我们来看一下

class Student(model.Model):
    my_id = models.AutoField(primary_key=True)
    name = models.Charfield(max_length=32)

 这个时候,你可以用pk来找,因为django它知道Student的主键是my_id 但是,如果你用id去找的话,那就对不起,查无此人。

7.关键功能实现细节####用户头像处理 python# from django.db import models from django.contrib.auth.models import AbstractUser from django.contrib.auth.base_user import BaseUserManager from django.core.files.storage import FileSystemStorage class OverwriteStorage(FileSystemStorage): """覆盖同名文件""" def get_available_name(self, name, max_length=None): if self.exists(name): self.delete(name) return name class User(AbstractUser): # ...其他字段 avatar = models.ImageField( '头像', upload_to='avatars/', storage=OverwriteStorage(), default='avatars/default.jpg' ) def save(self, *args, **kwargs): """保存前删除旧头像""" if self.pk: old_instance = User.objects.get(pk=self.pk) if old_instance.avatar and old_instance.avatar != self.avatar: old_instance.avatar.delete(save=False) super().save(*args, **kwargs) ####搜索功能优化 python# class MovieListView(ListView): model = Movie paginate_by = 10 def get_queryset(self): queryset = super().get_queryset() search_term = self.request.GET.get('search', '') genre_id = self.request.GET.get('genre', '') if search_term: queryset = queryset.filter( Q(title__icontains=search_term) | Q(director__icontains=search_term) | Q(description__icontains=search_term) ) if genre_id: queryset = queryset.filter(genres__id=genre_id) return queryset.distinct() def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['genres'] = Genre.objects.annotate(movie_count=Count('movie')) # 传递当前筛选状态 search_term = self.request.GET.get('search', '') genre_id = self.request.GET.get('genre', '') if search_term: context['search_term'] = search_term if genre_id: try: context['selected_genre'] = Genre.objects.get(id=genre_id) except Genre.DoesNotExist: pass return context ####邮件提醒功能 python# from django.core.mail import send_mail from django.conf import settings def send_new_movie_notification(movie): """发送新电影通知""" subject = f'新电影上线: {movie.title}' message = f'''您好, 我们刚刚添加了电影"{movie.title}",导演为{movie.director}。 电影简介: {movie.description} 立即查看: {settings.SITE_URL}{movie.get_absolute_url()} ''' send_mail( subject=subject, message=message, from_email=settings.DEFAULT_FROM_EMAIL, recipient_list=[user.email for user in User.objects.filter(is_subscribed=True)], fail_silently=True ) def send_rating_notification(rating): """发送评分通知""" subject = f'用户为电影{rating.movie.title}评分' message = f'''您好, 用户{rating.user.email}为电影"{rating.movie.title}"评了{rating.score}星。 评论内容: {rating.comment} 查看详情: {settings.SITE_URL}{rating.movie.get_absolute_url()} ''' send_mail( subject=subject, message=message, from_email=settings.DEFAULT_FROM_EMAIL, recipient_list=[rating.movie.created_by.email], fail_silently=True ) ###8.安全性和错误处理####CSRF保护 python# CSRF_COOKIE_HTTPONLY = True CSRF_COOKIE_SECURE = True # 生产环境启用 CSRF_TRUSTED_ORIGINS = ['https://yourdomain.com'] # 生产环境设置 ####登录保护 python# MIDDLEWARE = [ # ... 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.security.SecurityMiddleware', ] # 限制敏感操作需要登录 from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin class MovieDeleteView(LoginRequiredMixin, DeleteView): # 确保只有创建者可以删除 def dispatch(self, request, *args, **kwargs): obj = self.get_object() if obj.created_by != request.user: raise PermissionDenied("您无权删除此电影") return super().dispatch(request, *args, **kwargs) 这些放在什么文件中
最新发布
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值