Django查询问题:如何获取当前用户名下的IP及资产名称
解决方案:获取当前用户关联的资产IP与名称
首先确认你的Asset模型结构应该类似这样(如果有差异请对应调整):
from django.db import models from django.contrib.auth.models import User class Asset(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='assets') asset_name = models.CharField(max_length=100) ip_address = models.GenericIPAddressField() # 其他自定义字段
核心问题与修正
你遇到的错误是因为把字符串(比如用户名)直接和User对象进行比较,而Asset的user字段是ForeignKey,存储的是User实例的关联关系,过滤时必须传入User对象或对应的ID数值。
1. 在视图中获取当前用户的资产
函数视图写法
from django.contrib.auth.decorators import login_required from .models import Asset @login_required def user_profile(request): # 直接用request.user(User对象)过滤,而非字符串 user_assets = Asset.objects.filter(user=request.user).only('asset_name', 'ip_address') return render(request, 'accounts/profile.html', {'user_assets': user_assets})
类视图写法
from django.views.generic import TemplateView from django.contrib.mixins import LoginRequiredMixin from .models import Asset class ProfileView(LoginRequiredMixin, TemplateView): template_name = 'accounts/profile.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 同样使用self.request.user作为过滤条件 context['user_assets'] = Asset.objects.filter(user=self.request.user).only('asset_name', 'ip_address') return context
2. 在模板中展示资产详情
在个人资料模板里循环渲染数据:
<div class="user-assets"> <h3>我的资产</h3> {% for asset in user_assets %} <div class="asset-item"> <p><strong>资产名称:</strong> {{ asset.asset_name }}</p> <p><strong>IP地址:</strong> {{ asset.ip_address }}</p> </div> {% empty %} <p>暂无关联资产</p> {% endfor %} </div>
额外优化:使用related_name简化查询
如果你的Asset模型的user字段设置了related_name='assets'(如开头的模型示例),还可以通过用户对象直接反向查询资产:
# 替代filter写法,效果完全一致 user_assets = request.user.assets.all().only('asset_name', 'ip_address')
常见错误示例(避坑)
不要尝试用字符串过滤,比如以下写法都会报错:
# 错误:用用户名字符串和User对象比较 Asset.objects.filter(user=request.user.username) # 错误:用ID字符串而非数值 Asset.objects.filter(user_id=str(request.user.id))
内容的提问来源于stack exchange,提问作者alfred
相关产品推荐
相关产品推荐

