【问题标题】:Display content only for the user profile to which it belongs仅为其所属的用户配置文件显示内容
【发布时间】:2021-12-28 13:14:37
【问题描述】:

现在显示所有用户的费用,我只需要显示属于个人资料的费用。

我有模特:

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.

【问题讨论】:

    标签: python django-models django-authentication django-filter django-users


    【解决方案1】:

    我认为问题在于您的外键。如果我知道您想要做的是使用与登录用户的 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()
    

    那么这将返回每辆带有本田品牌 ID 外键的汽车

    我相信通过给“Spend”一个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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多