我有一个用户创建页面的应用程序.我想运行一个简单的数据库查询,返回有多少用户创建了超过2页.
这基本上就是我想要做的,但当然这不是正确的方法:
User.objects.select_related('page__gte=2').count()
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
想象一下以下模型:
class Parent(Model):
...
class Child(Model)
father = ForeignKey(Parent)
...
Run Code Online (Sandbox Code Playgroud)
有些父母有孩子,有些则没有孩子(他们不是真正意义上的父母,只是虚构的名字).
我想提出以下问题:我想列出所有的父母,如果他们有孩子,也请带孩子.这相当于Child表的左外连接,即:
select * from app_parent left join app_child on child_father_id=parent_id
Run Code Online (Sandbox Code Playgroud)
这样,当我在模板中调用Parent.child_set时,我不会在数据库中访问数十亿次.有没有办法做到这一点?谢谢
我使用外键有两个模型文章和博客相关.我想在提取文章时只选择博客名称.
articles = Articles.objects.all().select_related('blog__name')
Run Code Online (Sandbox Code Playgroud)
生成的查询显示它选择了Blog模型中的所有字段.我尝试使用select()和defer()与select_related,但两个都没有用.
articles = Articles.objects.all().select_related('blog__name').only('blog__name', 'title', 'create_time')
Run Code Online (Sandbox Code Playgroud)
上述查询导致错误:select_related中给出的字段名称无效:选项为:blog
如何生成查询以便仅选择文章字段和博客名称?
django django-queryset django-select-related python-2.7 django-1.8
我有 :
class Award(models.Model) :
name = models.CharField(max_length=100, db_index=True)
class Alias(models.Model) :
awards = models.ManyToManyField('Award', through='Achiever')
class Achiever(models.Model):
award = models.ForeignKey(Award)
alias = models.ForeignKey(Alias)
count = models.IntegerField(default=1)
Run Code Online (Sandbox Code Playgroud)
我怎样才能Alias
拥有全部achiever_set
和awards
预先填充的?
>>> db.reset_queries()
>>> Alias.objects.filter(id="450867").select_related("achiever_set__award").get().achiever_set.all()[0].award.name
u'Perma-Peddle'
>>> len(db.connection.queries)
3
>>> db.reset_queries()
>>> Alias.objects.filter(id="450867").select_related("awards").get().awards.all()[0].name
u'Dwarfageddon (10 player)'
>>> len(db.connection.queries)
2
Run Code Online (Sandbox Code Playgroud)
我将需要很多访问别名已经获得的奖项(中间表和奖项本身).我如何批量所有这些?
我有以下型号:
class User(models.Model):
name = models.Charfield()
email = models.EmailField()
class Friendship(models.Model):
from_friend = models.ForeignKey(User)
to_friend = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
这些模型用于以下视图和序列化程序:
class GetAllUsers(generics.ListAPIView):
authentication_classes = (SessionAuthentication, TokenAuthentication)
permission_classes = (permissions.IsAuthenticated,)
serializer_class = GetAllUsersSerializer
model = User
def get_queryset(self):
return User.objects.all()
class GetAllUsersSerializer(serializers.ModelSerializer):
is_friend_already = serializers.SerializerMethodField('get_is_friend_already')
class Meta:
model = User
fields = ('id', 'name', 'email', 'is_friend_already',)
def get_is_friend_already(self, obj):
request = self.context.get('request', None)
if request.user != obj and Friendship.objects.filter(from_friend = user):
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
所以基本上,对于GetAllUsers
视图返回的每个用户,我想打印出用户是否是请求者的朋友(实际上我应该检查from_和to_friend,但对于问题并不重要)
我看到的是,对于数据库中的N个用户,有1个查询用于获取所有N个用户,然后在序列化程序中查询1xN个查询 get_is_friend_already
有没有办法在休息框架方式中避免这种情况?也许是将select_related …
python django-orm django-queryset django-select-related django-rest-framework
select_related如何使用具有多个外键的模型?它只是选择第一个吗?
class Model:fkey1,fkey2,fkey3 ......
文档没有说明这一点,至少没有说明方法的位置.
我在这里阅读了文档和所有相关问题,但我还没有正确理解select_related在链接/多个外键上的行为。
假设我们有以下模型:
class RecordLabel(models.Model):
title = models.CharField(...)
class Band(models.Model):
band_name = models.CharField(...)
class Artist(models.Model):
record_label = models.ForeignKey(RecordLabel,...)
belongs_to_band = models.ForeignKey(Band, ...)
class Producer(models.Model):
customer = models.ForeignKey(Artist, ...)
Run Code Online (Sandbox Code Playgroud)
A.我们将如何在 a 中使用 select_related
Producer.objects.filter(...).select_related(?)
Run Code Online (Sandbox Code Playgroud)
查询以便预加载所有内容?会不会是这样:
Producer.objects.filter(...).select_related(
'customer__record_label', 'customer__belongs_to_band')
Run Code Online (Sandbox Code Playgroud)
为什么?
B.如果班级有“流派”作为外键,
class Genre(models.Model):
genre_name = models.CharField(...)
class Band(models.Model):
band_name = models.CharField(...)
music_genre = models.ForeignKey(Genres, ...)
Run Code Online (Sandbox Code Playgroud)
然后为了预加载所有内容,我们将执行以下操作:
Producer.objects.filter(...).select_related(
'customer__record_label__music_genre', 'customer__record_label__band_name',
'customer__belongs_to_band__music_genre', 'customer__belongs_to_band__music_genre')
Run Code Online (Sandbox Code Playgroud)
或类似的东西:
Producer.objects.filter(...).select_related(
'customer__record_label__music_genre', 'customer__record_label__band_name',
'customer__belongs_to_band', 'customer__belongs_to_band')
Run Code Online (Sandbox Code Playgroud) 我有一个User模型和UserProfile模型.在User模型中,我想命令我的查询,使其按last_name的字母顺序排列.然后我想通过User_profiles"title"属性(经理,执行,会计等)来订购它.
楷模:
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
title = models.CharField(max_length=20)
Run Code Online (Sandbox Code Playgroud)
视图:
def user_index(request):
i = User.objects.all().order_by('last_name', 'title')
return render_to_response('db/user_index.html', {'i': i ,}, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
"标题"不是用户模型的属性,而是与UserProfile模型的用户相关.如何按字母顺序对UserProfile.title进行排序?
在我的Django应用程序中,我想用select_related()
a QuerySet
来"跟随"一个ForeignKey
字段,但我只需要访问"跟随"模型实例上的一些字段.我可以defer()
用"跟随"字段以某种方式使用该方法.
例如,如果我有......
class BarModel(models.Model):
...
blah = models.TextField()
class FooModel(models.Model):
bar = models.ForeignKey(BarModel)
...
Run Code Online (Sandbox Code Playgroud)
......我正在做我FooModel.objects.all().select_related('bar')
怎么能defer()
在这个领域blah
.
谢谢.
我有来自不同应用程序的两个模型:
class Measure(models.Model):
date = models.DateTimeField(default="2018-01-23 15:55")
average = models.FloatField(default=0)
class Sensor(models.Model):
measure=models.ForeignKey(Measure, on_delete=models.CASCADE)
value= models.FloatField(default=0)
Run Code Online (Sandbox Code Playgroud)
我正在调用来自传感器的所有数据,如下所示:
new_context = Sensor.objects.select_related('measure__date')
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
django.core.exceptions.FieldError: select_related 中给出的非关系字段:'date'。选项是:(无)
从文档中,我应该使用 select_related 而不是 prefetch_related,并且调用似乎是连贯的。
我错过了什么吗?
python django django-models django-queryset django-select-related