标签: django-orm

Django QuerySet过滤器方法为一条记录返回多个条目

尝试检索包含满足某些条件的条目的博客(请参阅下面的模型说明):

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)

django django-models django-orm

11
推荐指数
2
解决办法
2627
查看次数

如何通过模型编写与SelfToMany关系的Django模型

我想要一个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与现场通过关系,如果其他模型的名字是"宠物",例如我会通过类的名字我在这领域personpet,使他们的模型.ForeignKey(Person)Pet例如

由于他们是同一个型号,我fields在我的PersonFriends模型中为两个人的名字命名了什么?

django django-models django-orm

11
推荐指数
2
解决办法
5432
查看次数

commit_on_success如何处理嵌套?

我对如何处理特定情况下的交易感到有点困惑.

我有一些代码可以归结为:

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()回滚?

database django django-orm

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

使用Django admin时,ManyToMany字段未保存

我遇到了一个奇怪的问题,我希望这里的某些人能够对此有所了解.

我正在重写模型的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关系的所有手动更改.这与处理表单的方式有关吗?

python django django-orm m2m

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

Django指望多对多

我有模特:

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)

django django-orm

11
推荐指数
2
解决办法
7783
查看次数

TypeError:int()参数必须是字符串或数字,而不是'datetime.datetime'

我将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模型和问题模型之间添加外键关系.

python django django-orm

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

始终是真Q对象

我想创建一些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)

django django-orm django-q

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

Django查询需要条件和转换的计算字段的表达式

我正在尝试运行一个大致等于的聚合查询:

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 django postgresql django-orm

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

更新对象的选择,每个对象具有不同的批量值(Django)

想象一下,我有一个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 django-orm

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

Django 1.8 - 中间人多对多关系 - 使用'ManytoManyField'的结果是什么?

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 many-to-many django-orm relationship m2m

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