【问题标题】:Django query filter by another dataset另一个数据集的 Django 查询过滤器
【发布时间】:2021-09-11 18:12:26
【问题描述】:

我有 2 个用户模型:

  1. 用户:默认用户模型:

  2. 帐户:自定义用户模型,它是默认用户模型的扩展,因为我想在其中添加一个名为“状态”的自定义字段。

问题是我想根据当前用户过滤数据,所以 id 通常会这样做:

Account.objects.filter(usernmae = User).values_list('status', flat=True)

问题是 Account 数据集没有用户名,但它们都有相同的 ID。

我正在考虑做这样的事情:

Status = Account.objects.filter(user_id=User.objects.filter(username = user).values_list('id', flat=True)).values_list('status', flat=True)

然后我收到以下错误:

如果你们能帮助我,我想有更好的方法。

Views.py:

def upload_audits(request):
    form = audits_form(request.POST or None, request.FILES or None)
    if form.is_valid():
        form.save()
        form = audits_form()
        obj = Csv_Audit.objects.get(activated=True)
        with open(obj.file_name.path,'r') as f:
            #to clear model contents before applying new data
            auditsModel.objects.all().delete()

            reader = csv.reader(f)

            for i,row in enumerate(reader):
                if i==0:
                    pass
                else:
                    user = row[1] # gets data from CSV Table and returns username
                    Status = Account.objects.filter(user_id = request.user).values_list('status')


                    
                    
                    auditsModel.objects.create(
                
                        qs_login = user,
                        Status = Status,

                        

                    )

                    
            obj.activated = True
            obj.save()   

    return render(request,"backend/uploads.html",{'form':form})

Accounts.py(模型)

class Account(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    status = models.CharField(('Status'), max_length=200, default='',choices = [('Bau','Bau'),('Week 1','Week 1')])

    def __str__(self):
        return self.user.username

1 个答案:mahdi rahimi

我用下面的代码试过你的方法:

Status = Account.objects.filter(user__username = user).values_list('status', flat=True)

导致以下错误:

然后我想到这样做:

Status = Account.objects.filter(user = user).values_list('status', flat=True)

但我得到了这个错误:

哪个实际上返回了用户名,但它似乎在要求一个 int?

【问题讨论】:

  • user_id__in=User.objects.filter(...)
  • 基于username=user,您可以更有效地执行此操作。可以分享一下相关观点吗?
  • 对于当前用户,您可以使用 user_id=user.objects.get(username=user) 或尽可能从 request.user 数据中获取 id。
  • 我写了这个:Status = Account.objects.filter(user_id = request.user).values_list('status') 它填充了字段,但它填充了当前状态的所有字段用户,相反,我希望每个用户都有与其用户名匹配的状态字段。我已经添加了views.py //////顺便感谢您的支持!
  • @King: 你能分享一下你的Account 模型吗...

标签: python django django-models django-views


【解决方案1】:

根据我的经验,您可以简单地加入这两个表,并得到您想要的。大致翻译成这样:

result = Account.objects.filter(user__username = user).values_list('status', flat=True)

或者,如果您对此感到满意,您可以执行两个查询。

found_user_id = User.objects.filter(username = user).values_list('id', flat = True)
result = Account.objects.filter(user_id = found_user_id).values_list('status', flat=True)

希望有所帮助。

【讨论】:

  • 非常感谢您的意见,所以我尝试了您的第一种方法,我认为这应该是正确的,然后我尝试了:Status = Account.objects.filter(user = user).values_list( 'status', flat=True)
  • 请查看主题,因为我在 1 个答案的底部添加了我的尝试
  • 对不起,我不能在上面的部分添加评论。请避免对变量使用大写单词。这里的“状态”意味着python的一些特殊词,所以它会给你这个错误。改用“状态”或“结果”。告诉我它是否能解决您的问题。
猜你喜欢
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2014-12-13
  • 2016-07-20
  • 2015-10-14
  • 1970-01-01
  • 2011-06-23
  • 2014-06-12
相关资源
最近更新 更多