标签: django-queryset

我如何将这些多重连接作为 Django 查询集进行?

我有一个将多个表连接在一起的查询:

select 
    p.player_id
    , d.player_data_1
    , l.year
    , l.league
    , s.stat_1
    , l.stat_1_league_average
from 
    stats s
inner join players p on p.player_id = s.player_id
left join player_data d on d.other_player_id = p.other_player_id
left join league_averages as l on l.year = s.year and l.league = s.year
where 
    p.player_id = 123
Run Code Online (Sandbox Code Playgroud)

我的模型看起来像这样:

class Stats(models.Model):
    player_id = models.ForeignKey(Player)
    stat_1 = models.IntegerField()
    year = models.IntegerField()
    league = models.IntegerField()


class Player(models.Model):
    player_id = models.IntegerField(primary_key=True)
    other_player_id = models.ForeignKey(PlayerData)

class PlayerData(models.Model):
    other_player_id = models.IntegerField(primary_key=True)
    player_data_1 = models.TextField() …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-queryset python-3.x

1
推荐指数
1
解决办法
1万
查看次数

是否可以在Django中组合多个values_list()?

正如标题所示,我有多组查询,每组查询都返回一个值列表。然后,我使用值列表来过滤另一个查询集。目前我只能一次执行第二步一个查询集。是否可以将我的初始值列表合并为一个超长列表?我正在尝试创建一个类似活动/新闻提要的功能。

视图.py:

cookie_ids = Cookie.objects.filter(board__pk=self.kwargs['pk']).values_list('id',
                                                           flat=True)

sugar_ids = Sugar.objects.filter(board__pk=self.kwargs['pk']).values_list('id',
                                                           flat=True)

**then:
context['cookie_actions'] = Action.objects.filter(target_id__in=cookie_ids)
context['sugar_actions'] = Action.objects.filter(target_id__in=sugar_ids)
Run Code Online (Sandbox Code Playgroud)

编辑:我认为这是唯一可能重要的模型

Models.py:
class Action(models.Model):
    user = models.ForeignKey(User,
                             related_name='actions',
                             db_index=True)
    verb = models.CharField(max_length=255)

    target_ct = models.ForeignKey(ContentType,
                                  blank=True,
                                  null=True,
                                  related_name='target_obj')
    target_id = models.PositiveIntegerField(null=True,
                                            blank=True,
                                            db_index=True)
    target = GenericForeignKey('target_ct', 'target_id')
    created = models.DateTimeField(auto_now_add=True,
                                   db_index=True)

    class Meta:
        ordering = ('-created',)
Run Code Online (Sandbox Code Playgroud)

django django-models django-queryset

1
推荐指数
1
解决办法
5445
查看次数

Django 过滤预取相关查询集

我正在使用Django 2.2

我有许多与User模型反向相关的模型,我想从具有不同过滤器的每个模型中获取计数。

例如,我有一个Relations像这样的模型

status = (
  ('Active', 'active')
  ('Inactive', 'inactive')
)

class Relation(models.Model):
  user = models.ForeignKey(User, related_name='relation')
  status = models.CharField(choices=status, default=ACTIVE)
Run Code Online (Sandbox Code Playgroud)

现在我想为用户单独获取每个状态的计数和查询集。为此,我在User模型中定义了模型方法

def get_relation():
  return self.relation.all()

def get_active_relation(self):
  return self.relation().filter(status='active')

def get_inactive_relation():
  return self.relation().filter(status='inactive')

def get_active_count():
  return self.get_active_relation().count()

def get_inactive_count():
  return self.get_inactive_relaiton().count()
Run Code Online (Sandbox Code Playgroud)

我的用户对象为

user = User.objects.prefetch_related(
  'relation'
).get(pk=request.user.pk)
Run Code Online (Sandbox Code Playgroud)

现在,当我得到计数​​时,它会为此执行一个额外的查询

user.get_active_count()
Run Code Online (Sandbox Code Playgroud)

如何过滤对象prefetch_related

我在另一个 SOF 答案中发现了从 prefetch_latedlambda获取值的用途: /sf/answers/882661811/max

是否也可以用于lambda过滤查询集?

django django-models django-queryset

1
推荐指数
1
解决办法
4080
查看次数

如何在 Django 注释中获得布尔结果?

我有一个过滤器,它应该返回一个包含 2 个对象的查询集,并且应该有一个不同的字段。例如:

obj_1 = (name='John', age='23', is_fielder=True)
obj_2 = (name='John', age='23', is_fielder=False)
Run Code Online (Sandbox Code Playgroud)

两个对象具有相同的模型,但主键不同。我尝试使用以下过滤器:

qs = Model.objects.filter(name='John', age='23').annotate(is_fielder=F('plays__outdoor_game_role')=='Fielder')
Run Code Online (Sandbox Code Playgroud)

我第一次使用注释,但它给了我以下错误:

TypeError: QuerySet.annotate() received non-expression(s): False.
Run Code Online (Sandbox Code Playgroud)

我是 Django 新手,所以我做错了什么,应该使用什么注释来获取如上所示的所需对象?

django django-queryset django-rest-framework

1
推荐指数
2
解决办法
2672
查看次数

如何注释现有查询集

我想在基于类的视图中使用注释更新查询集。

为什么这有效:

def get_queryset(self):
   qs = self.model._default_manager.all().annotate(admin_roles_count=Count('administrators'))
   return qs
Run Code Online (Sandbox Code Playgroud)

但这不?:

def get_queryset(self):
    qs = super().get_queryset()
    qs.annotate(admin_roles_count=Count('administrators'))
    return qs
Run Code Online (Sandbox Code Playgroud)

print(qs[0].admin_roles_count)抛出:

AttributeError: 'MyModel' object has no attribute 'admin_roles_count'
Run Code Online (Sandbox Code Playgroud)

django django-queryset

1
推荐指数
1
解决办法
753
查看次数

Django F() 和 ExpressionWrapper

我试图避免数据库命中我的views.py。如果我使用 F() 和 ExpressionWrapper,我是否对数据库进行查询?我正在尝试优化我的代码,当我阅读文档时有点困惑。我还包含了 Models.py 以供参考。我正在对我正在工作的网络应用程序进行优化。

视图.py

from django.shortcuts import render
from django.db.models import F, Q, Count, Sum, ExpressionWrapper, IntegerField
from .models import Student, Subject, Enrollment


def home(request):
    student = Student.objects.all()
    subject = Subject.objects.all()
    sem_score = Enrollment.objects.all().update(sem_score=ExpressionWrapper((F("prelim_score") + F("midterm_score") + F("final_score"))/3, output_field=IntegerField()))
    enrollment = Enrollment.objects.all()
    num_student = Enrollment.objects.all().count()
    context = {"student":student, "subject":subject, "enrollment":enrollment, "num_student":num_student}
    return render(request, 'core/home.html', context)
Run Code Online (Sandbox Code Playgroud)

模型.py

class Professor(models.Model):
    name = models.CharField(max_length=50)
    
    def __str__(self):
        return self.name
    
class Student(models.Model):
    name = models.CharField(max_length=50)
    
    def __str__(self):
        return self.name
    
class Course(models.Model):
    name …
Run Code Online (Sandbox Code Playgroud)

python django django-queryset django-views

1
推荐指数
1
解决办法
8406
查看次数

如何在没有多对多关系的情况下查询一个 Django 模型并访问另一个 Django 模型?

我有一个名为 WatchList 的模型,其中有一个名为 Listing 的对象,该对象通过外键对应于 Listings 模型。我希望能够通过 WatchList 模型进行查询,以获取用户特定监视列表上的所有列表,并在网页上显示所有列表的所有对象。我不想使用 ManyToMany 字段来执行此操作,因为我刚刚获得了处理 WatchList 模型的 Web 应用程序的不同部分。还有其他方法可以做到这一点吗?

视图.py

def watchlist(request):
    watchlists = WatchList.objects.filter(user=request.user)
    for listing in watchlists.listing:
        listings_needed = watchlists.listing()
    watchlist_listing = watchlists.get(listing)
    listings = Listings.objects.all().filter(watchlist_listing)
    return render(request, "auctions/watchlist.html",{
        "listings": listings
    })
Run Code Online (Sandbox Code Playgroud)

模型.py

class Listings(models.Model):
    CATEGORY = [
    ("Miscellaneous", "Miscellaneous"),
    ("Movies and Television", "Movies and Television"),
    ("Sports", "Sports"),
    ("Arts and Crafts", "Arts and Crafts"),
    ("Clothing", "Clothing"),
    ("Books", "Books"),
]
    title = models.CharField(max_length=64)
    description = models.CharField(max_length=500)
    bid = models.DecimalField(max_digits=1000000000000, decimal_places=2)
    image = models.URLField(null=True, …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-queryset django-views

1
推荐指数
1
解决办法
178
查看次数

使用Django queryset在列中搜索多个单词

我有一个自动完成框,需要返回包含输入单词的结果.然而,输入词可以是部分的并且以不同的顺序或位置定位.

例:

数据库列(MySQL)中的值 -

Expected quarterly sales
Sales preceding quarter
Profit preceding quarter
Sales 12 months
Run Code Online (Sandbox Code Playgroud)

现在,如果用户输入,quarter sales那么它应该返回前两个结果.

我试过了:

column__icontains = term  #searches only '%quarter sales% and thus gives no results
column__search = term  #searches any of complete words and also returns last result
**{'ratio_name__icontains':each_term for each_term in term.split()}   #this searches only sales as it is the last keyword argument
Run Code Online (Sandbox Code Playgroud)

通过正则表达式的任何技巧或可能是我在Django中内置的东西,因为这是一个常见的模式?

django django-queryset

0
推荐指数
1
解决办法
2875
查看次数

获取Django查询集中项目数的最佳方法是什么?

我正在做一个Django查询.我想知道有多少MyModel有myAttribute值为"X".这就是我这样做的方式:

len(MyModel.objects.filter(myAttribute="X"))
Run Code Online (Sandbox Code Playgroud)

这是处理它的最有效方法吗?我担心这会不必要地从数据库中获取比我需要的更多的数据,而是我应该使用Count()函数.但是,从我看过的例子中我发现我不确定是否可以将Count()与filter()结合起来.有人可以建议吗?

django django-models django-queryset

0
推荐指数
1
解决办法
67
查看次数

"不喜欢"QuerySet中的条件

Django的新手,以下是我的问题:

背景

我有一个列的值如下:

ABCDEF
ABCDDD
ABCDEG
ACDFER
ACDFDF
AVXZSE
XSDFRW
Run Code Online (Sandbox Code Playgroud)

我想拒绝从AV和开始的值XS,我真的很惊讶我没有得到任何在线相关的django查询集,这可以帮助我这样做,而MySQL不是简单not like "AV%".我在SO找到的
一个解决方案与之相关,但我不能自由地使用任何超出本机内置方法的东西.Q

问题:

我想知道是否有人可以指导我执行exclude以上场景,如下所示:

DataSet.exclude(column_name="^AV",column_name="^XS")
Run Code Online (Sandbox Code Playgroud)

python django django-queryset

0
推荐指数
1
解决办法
318
查看次数