仅为其所属的用户配置文件显示内容
Display content only for the user profile to which it belongs
现在显示所有用户的费用,我只需要显示属于配置文件的费用。
我有型号:
class Spend(models.Model):
user = models.ForeignKey(Profile, null=True, blank=True, on_delete=models.SET_NULL)
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
name = models.CharField(max_length=200)
spend = DecimalField(max_digits=14, decimal_places=2)
And model:
class Profile(models.Model):
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
username = models.CharField(max_length=200, blank=True, null=True)
在我看来:
@login_required
def costs(request):
filter = CostFilter(request.GET, queryset=Spend.objects.all())
return render(request, 'users/includes/costs.html', {
'filter': filter
})
模板:
{% for cost_item in filter.qs %}
<tbody>
<tr>
<td>{{ cost_item.name }}</td>
<td>{{ cost_item.spend }}</td>
<td>
class CostFilter(django_filters.FilterSet):
class Meta:
model = Spend
fields = ("name", "spend")
我正在尝试:
filter = CostFilter(request.GET, queryset=Spend.objects.filter(user=request.user)
但是得到:
Cannot query "test": Must be "Profile" instance.
我认为问题出在您的外键上。如果我知道您想要做的是使用与登录用户 ID 匹配的外键访问任何 Spend,那么您可以通过“相关名称”来执行此操作,由于某种原因,多对一中未提及该名称django 文档中的页面,因为这是我学会的唯一方法。
这是我的一些代码。
class Brand(models.Model):
name = models.CharField(max_length=50)
class Car(models.Model):
make = models.ForeignKey('Brand',on_delete=models.CASCADE,related_name='cars')
然后当我 python manage.py shell 假设我已经让“本田”成为一个品牌时:
$ from cars_and_brands.models import Car,Brand
$ c = Car(make=Brand.objects.get(name='Honda')
$ Brand.objects.get(name='Honda').cars.all()
然后 return 每辆带有本田品牌 ID 外键的汽车
我相信通过给“花费”一个 related_name='user_spends' 或其他任何东西然后你可以做类似的事情
profile = Profile.objects.get(#query for logged in user)
profile.user_spends.all()
然后您将获得所有关联的 user_spends。
希望我理解了你的问题,这对你有所帮助。
我相信文档的做法是添加“_set”并有一些默认模式,它在背面命名外键,但我在学习 django 模型之前学习了 SQL,所以我'我宁愿能够随心所欲地调用它,到目前为止,在我使用 Django 的短暂时间里,我一直只使用 related_name,因为在我看来,它更具可读性和易于理解。
显然,如果您没有唯一的相关名称,您可以 运行 解决问题,也许这就是为什么它们在文档中似乎被忽视或不鼓励的原因。
以下是我参考的一些文档:
One of the most useful pages on Django models
Talks about related_name which isn't very well documented IMO
现在显示所有用户的费用,我只需要显示属于配置文件的费用。
我有型号:
class Spend(models.Model):
user = models.ForeignKey(Profile, null=True, blank=True, on_delete=models.SET_NULL)
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
name = models.CharField(max_length=200)
spend = DecimalField(max_digits=14, decimal_places=2)
And model:
class Profile(models.Model):
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
username = models.CharField(max_length=200, blank=True, null=True)
在我看来:
@login_required
def costs(request):
filter = CostFilter(request.GET, queryset=Spend.objects.all())
return render(request, 'users/includes/costs.html', {
'filter': filter
})
模板:
{% for cost_item in filter.qs %}
<tbody>
<tr>
<td>{{ cost_item.name }}</td>
<td>{{ cost_item.spend }}</td>
<td>
class CostFilter(django_filters.FilterSet):
class Meta:
model = Spend
fields = ("name", "spend")
我正在尝试:
filter = CostFilter(request.GET, queryset=Spend.objects.filter(user=request.user)
但是得到:
Cannot query "test": Must be "Profile" instance.
我认为问题出在您的外键上。如果我知道您想要做的是使用与登录用户 ID 匹配的外键访问任何 Spend,那么您可以通过“相关名称”来执行此操作,由于某种原因,多对一中未提及该名称django 文档中的页面,因为这是我学会的唯一方法。
这是我的一些代码。
class Brand(models.Model):
name = models.CharField(max_length=50)
class Car(models.Model):
make = models.ForeignKey('Brand',on_delete=models.CASCADE,related_name='cars')
然后当我 python manage.py shell 假设我已经让“本田”成为一个品牌时:
$ from cars_and_brands.models import Car,Brand
$ c = Car(make=Brand.objects.get(name='Honda')
$ Brand.objects.get(name='Honda').cars.all()
然后 return 每辆带有本田品牌 ID 外键的汽车
我相信通过给“花费”一个 related_name='user_spends' 或其他任何东西然后你可以做类似的事情
profile = Profile.objects.get(#query for logged in user)
profile.user_spends.all()
然后您将获得所有关联的 user_spends。
希望我理解了你的问题,这对你有所帮助。
我相信文档的做法是添加“_set”并有一些默认模式,它在背面命名外键,但我在学习 django 模型之前学习了 SQL,所以我'我宁愿能够随心所欲地调用它,到目前为止,在我使用 Django 的短暂时间里,我一直只使用 related_name,因为在我看来,它更具可读性和易于理解。
显然,如果您没有唯一的相关名称,您可以 运行 解决问题,也许这就是为什么它们在文档中似乎被忽视或不鼓励的原因。
以下是我参考的一些文档:
One of the most useful pages on Django models
Talks about related_name which isn't very well documented IMO