尝试检索包含满足某些条件的条目的博客(请参阅下面的模型说明):
Blog.objects.filter(entries__title__contains='entry')
Run Code Online (Sandbox Code Playgroud)
结果是:
[<Blog: blog1>, <Blog: blog1>]
Run Code Online (Sandbox Code Playgroud)
由于为了过滤相关模型上的对象而执行了JOIN,因此检索了相同的博客对象两次.仅过滤唯一对象的正确语法是什么?
数据模型:
class Blog(models.Model):
name = models.CharField(max_length=100)
def __unicode__(self):
return self.name
class Entry(models.Model):
title = models.CharField(max_length=100)
blog = models.ForeignKey(Blog, related_name='entries')
def __unicode__(self):
return self.title
Run Code Online (Sandbox Code Playgroud)
样本数据:
b1 = Blog.objects.create(name='blog1')
e1 = Entry.objects.create(title='entry 1', blog=b1)
e1 = Entry.objects.create(title='entry 2', blog=b1)
Run Code Online (Sandbox Code Playgroud) 我想要一个ManyToMany与自己有关系的模型,我不知道怎么写这个,但我试着写一些代码来说明我想做什么.
class Person(models.Model):
name = models.CharField()
occupation = models.CharField()
friends = models.ManyToManyField('self', through = PersonFriends)
Run Code Online (Sandbox Code Playgroud)
我的模特,我希望朋友们通过
class PersonFriends(models.Model)
???
comment = models.CharField()
Run Code Online (Sandbox Code Playgroud)
在ManyToMany与现场通过关系,如果其他模型的名字是"宠物",例如我会通过类的名字我在这领域person和pet,使他们的模型.ForeignKey(Person)而Pet例如
由于他们是同一个型号,我fields在我的PersonFriends模型中为两个人的名字命名了什么?
我对如何处理特定情况下的交易感到有点困惑.
我有一些代码可以归结为:
from django.db import transaction
@transaction.commit_on_success
def process_post():
#do stuff with database
for reply in post_replies:
process_post_reply(reply)
@transaction.commit_on_success
def process_post_reply(reply):
#do stuff with database
Run Code Online (Sandbox Code Playgroud)
我想知道如果process_post_reply()失败会发生什么.
commit_on_success如何处理嵌套?是否理解提交每个process_post_reply()或如果一个失败整个process_post()回滚?
我遇到了一个奇怪的问题,我希望这里的某些人能够对此有所了解.
我正在重写模型的save()方法,以便在运行super()之后向ManyToMany字段添加一些值.我的问题是,当我在Django admin中保存时,值似乎被添加到关系中,但然后再次为空.
但是,如果我这样做,manage.py shell它没有问题.
我已经在那里放了两个打印语句,无论我是通过Django admin还是通过shell运行它,它们都会产生完全相同的输出.
class Store(models.Model):
holidays = models.ManyToManyField(StoreHoliday, blank=True)
copy_holidays_from = models.ForeignKey('Store', blank=True, null=True)
def save(self):
print '==== BEFORE SAVE:', self.holidays.all()
super(Store, self).save()
self.copy_holidays()
print '==== AFTER SAVE:', self.holidays.all()
def copy_holidays(self):
if self.pk and self.copy_holidays_from:
self.holidays.clear()
for h in self.copy_holidays_from.holidays.all():
self.holidays.add( h )
Run Code Online (Sandbox Code Playgroud)
这是print声明的输出:
==== BEFORE SAVE: []
==== AFTER SAVE: [<StoreHoliday: 10 Mar 2010, Chuck Norris birthday (Closed)>]
Run Code Online (Sandbox Code Playgroud)
有没有人对可能导致这种情况的原因有任何建议?
编辑:当通过管理界面保存时,Django似乎丢弃了save()中m2m关系的所有手动更改.这与处理表单的方式有关吗?
我有模特:
class Article(models.Model):
title = models.TextField(blank=True)
keywords = models.ManyToManyField(Keyword, null=True, blank=True)
class Keyword(models.Model):
keyword = models.CharField(max_length=355, blank=True)
Run Code Online (Sandbox Code Playgroud)
我想知道每个关键字有多少篇文章.从本质上讲,我希望有一个关键字列表,我可以在每个关键字中计算它们的相对权重.
我试过了:
keyword_list=Article.objects.all().annotate(key_count=Count('keywords__keyword'))
Run Code Online (Sandbox Code Playgroud)
但
keyword_list[0].key_count
Run Code Online (Sandbox Code Playgroud)
只是似乎给了我每篇文章不同关键词的数量?它是以某种方式反向查找?
任何帮助将非常感激.
UPDATE
所以我得到了它的工作:
def keyword_list(request):
MAX_WEIGHT = 5
keywords = Keyword.objects.order_by('keyword')
for keyword in keywords:
keyword.count = Article.objects.filter(keywords=keyword).count()
min_count = max_count = keywords[0].count
for keyword in keywords:
if keyword.count < min_count:
min_count = keyword.count
if max_count > keyword.count:
max_count = keyword.count
range = float(max_count - min_count)
if range == 0.0:
range = 1.0
for keyword …Run Code Online (Sandbox Code Playgroud) 我将App12/models.py模块设为:
from django.db import models
class Question(models.Model):
ques_text=models.CharField(max_length=300)
pub_date=models.DateTimeField('Published date')
def __str__(self):
return self.ques_text
class Choice(models.Model):
# question=models.ForeignKey(Question)
choice_text=models.CharField(max_length=300)
votes=models.IntegerField(default=0)
def __str__(self):
return self.choice_text
Run Code Online (Sandbox Code Playgroud)
然后我运行cmds
python manage.py makemigrations App12
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
然后在问题模型中输入2条记录:
Question.objects.create(ques_text="How are you?",pub_date='timezone.now()')
# and (ques_text="What are you doing?",pub_date='timezone.now()')
Run Code Online (Sandbox Code Playgroud)
然后我意识到问题和选择模型应该是外键关系,并在模型代码中取消注释上面注释的语句
当我运行" python manage.py makemigrations App12"时,它运行良好,但在那之后,我得到了
"TypeError: int() argument must be a string or a number, not 'datetime.datetime"
Run Code Online (Sandbox Code Playgroud)
我正在运行"python manage.py migrate"命令时出错.
任何人都可以帮助我.如何在Choice模型和问题模型之间添加外键关系.
我想创建一些Django ORM过滤器查询的一部分,现在我可以这样做:
if some:
Obj.filter(
some_f1=some_v1,
f1=v1,
f2=v2,
f3=v3,
f4=v4,
...
)
else:
Obj.filter(
f1=v1,
f2=v2,
f3=v3,
f4=v4,
...
)
Run Code Online (Sandbox Code Playgroud)
我希望没有代码重复的东西像这样:
Obj.filter(
Q(some_f1=some_v1) if some else True, # what to use instead of True?
f1=v1,
f2=v2,
f3=v3,
f4=v4,
...
)
Run Code Online (Sandbox Code Playgroud) 我正在尝试运行一个大致等于的聚合查询:
select
sum(impressions) as impressions,
sum(clicks) as clicks,
sum(clicks)/sum(impressions) as ctr
from stats
group by product
order by ctr;
Run Code Online (Sandbox Code Playgroud)
使用的数据库是PostgreSQL.
我做了这个查询表达式(Django 1.9):
Stats.objects.values('product').annotate(
impressions = models.Sum('impressions'),
clicks = models.Sum('clicks'),
ctr = models.ExpressionWrapper(
models.F('clicks')/models.F('impressions')), output_field = models.FloatField()
)
).order_by('ctr')
Run Code Online (Sandbox Code Playgroud)
它有两个问题:
ctr 是0.0因为它在数据库级别划分整数division by zero如果展示次数为0,则会抛出什么是正确的解决方案?
想象一下,我有一个python字典,其中键是现有用户ID,值是要添加到这些用户现有分数的分数.
例如:( {1: 1580, 4: 540, 2: 678}这可以拉伸到nk,v对)
我需要更新所有这些用户对象的分数(updated_score = original_score + new_score).一种方法是迭代,如下所示:
from django.db.models import F
scores = {1: 1580, 4: 540, 2: 678}
for user_id,score_to_add in scores.iteritems():
UserProfile.objects.filter(user_id=user_id).update(score=F('score')+score_to_add)
Run Code Online (Sandbox Code Playgroud)
但那是多个数据库调用.我可以一次通话吗?一个说明性的例子会很棒.正如您所猜测的那样,这是一个Django项目.
Django中的多对多关系示例:
class First(models.Model):
seconds = models.ManyToManyField(Second, through='Middle')
class Middle(models.Model):
first = models.ForeignKey(First)
second = models.ForeignKey(Second)
class Second(models.Model):
Run Code Online (Sandbox Code Playgroud)
根据中间模型的文档,只有一个相关对的ManytoManyField模型包含上面示例中的模型First.它是否正确?
如果是这样,哪个模型应包含该ManytoManyField字段?使用任何一方的关系是否有任何差异取决于它在哪里ManytoManyField?
谢谢
编辑(我应该更清楚):
我对中介表感兴趣,因为我将有额外的数据存储在关系中.
当我说使用时,我并不是指定义模型,我的意思是使用关系(否则我会让Django做它的事情).
如果我想要所有与第一个相关的秒,它是否与获得与第二个相关的所有第一个完全相同,或者ManytoManyField通过引入任何额外的功能使一个方向比另一个方向更容易?
django ×10
django-orm ×10
python ×3
m2m ×2
database ×1
django-q ×1
many-to-many ×1
postgresql ×1
relationship ×1