我有一个将多个表连接在一起的查询:
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) 正如标题所示,我有多组查询,每组查询都返回一个值列表。然后,我使用值列表来过滤另一个查询集。目前我只能一次执行第二步一个查询集。是否可以将我的初始值列表合并为一个超长列表?我正在尝试创建一个类似活动/新闻提要的功能。
视图.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 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过滤查询集?
我有一个过滤器,它应该返回一个包含 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 新手,所以我做错了什么,应该使用什么注释来获取如上所示的所需对象?
我想在基于类的视图中使用注释更新查询集。
为什么这有效:
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) 我试图避免数据库命中我的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) 我有一个名为 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) 我有一个自动完成框,需要返回包含输入单词的结果.然而,输入词可以是部分的并且以不同的顺序或位置定位.
例:
数据库列(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查询.我想知道有多少MyModel有myAttribute值为"X".这就是我这样做的方式:
len(MyModel.objects.filter(myAttribute="X"))
Run Code Online (Sandbox Code Playgroud)
这是处理它的最有效方法吗?我担心这会不必要地从数据库中获取比我需要的更多的数据,而是我应该使用Count()函数.但是,从我看过的例子中我发现我不确定是否可以将Count()与filter()结合起来.有人可以建议吗?
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)