仅为其所属的用户配置文件显示内容

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