标签: django-orm

Django ORM:获取满足特定条件的最新先前对象

给定一个对象:

class M(models.Model):
  test = models.BooleanField()
  created_date = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

给定样本数据(假设单调增加自动created_date):

M(test=False).save()

M(test=True).save()

M(test=False).save()

X = M(test=True).save()

M(test=False).save()

Y = M(test=False).save()

M(test=False).save()

M(test=True).save()
Run Code Online (Sandbox Code Playgroud)

如果给出Y,可以使用Django ORM创建一个返回X的查询(前一个查询,按日期,'test'= True).如果是这样,怎么样?

换句话说:给定Y,如何获得'test'为True的最新前一个元素?

感谢您的想法和反馈,谢谢!

django django-models django-orm

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

通过Django ORM获取两个领域的所有可用组合?

我有这个Django模型:

class Lecture(models.Model):
    lecture_number = models.CharField(_('lecture number'), max_length=20)
    title = models.CharField(_('title'), max_length=100)
    term = models.IntegerField(_('term'), choices=TERM, db_index=True)
    year = models.IntegerField(_('year'), db_index=True)
Run Code Online (Sandbox Code Playgroud)

term可以是12(春天或秋天).现在我想列出有讲座的所有术语,例如((2007, 2), (2008, 1), (2008, 2), (2009, 1), (2009, 2), (2010, 1)).该列表不必排序.是否可以有效地通过ORM生成此列表?我找到的最佳解决方案是:

term_list = set(Lecture.objects.values_list('year', 'term'))
Run Code Online (Sandbox Code Playgroud)

但是,ORM调用仍会返回每个结果Lecture并在Python中减少它,因此它可能会因为大量的Lectures而变慢.

python django django-orm

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

Django 模型中的任意连接

假设模型X有一个字段n(一个整数)。现在我还有一个Y包含字段nm(整数)的模型。是否有可能使用 Django ORM 来选择x(model X) 使得存在y(model Y)x.n = y.n并且y.m = m对于给定的值m

请不要建议我介绍ForeignKey两个模型之间的关系或类似的东西。我想特别知道是否可以在不修改模型的情况下实现这一点。在我正在处理的确切情况下,给定的关系是通用的。通用关系的另一面可以是任何东西,所以根据文档,我不能GenericRelation在不同的模型中多次引入。

python django join django-models django-orm

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

Django:多对多关系的自定义保存方法

我需要在多对多关系上设置自定义保存和删除方法.

我尝试使用"通过"属性指定一个模型,但这使我的代码过于复杂并引入了一些问题.我在多对多模型上不需要任何额外的字段,只需要自定义保存和删除方法.

是否可以在不指定"通过"属性的情况下完成此操作?

这是代码:

class Order(BaseDate):
    #lots of fields
    relateds = models.ManyToManyField('RelatedProduct', verbose_name=_('related products'), blank=True, related_name='order_relateds', through='OrderRelateds')
    # more fields
    total = CurrencyField(verbose_name=_('total'))

    def calculate_total(self):
        cleanses = self.cleanse.taxed_price() * self.quantity
        delivery = DELIVERY_PRICE if self.delivery == 'delivery' else 0
        relateds = 0
        for r in self.relateds.all():
            relateds = relateds + float(r.taxed_price())
        total = float(cleanses) + delivery + relateds
        return total

    def save(self, *args, **kwargs):
        self.total = '%.2f' % self.calculate_total()
        super(Order, self).save(*args, **kwargs)

class OrderRelateds(models.Model):
    order = models.ForeignKey(Order)
    relatedproduct = models.ForeignKey(RelatedProduct, …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-orm

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

拉取用户名 - "ManyRelatedManager"对象不支持索引

我正在一个允许用户玩异步游戏的网站上创建.我正在使用Python 2.7.5运行Django 1.5,并使用Django的本机用户身份验证API.我没有创建自定义用户模型,而是将每个用户链接到自定义UserDetails类.UserDetails类的相关代码如下:

    class UserDetails(models.Model):
        user = models.OneToOneField(User)
        join_date = models.DateTimeField(auto_now_add=True)
        games = models.ManyToManyField(Game, default=None)
Run Code Online (Sandbox Code Playgroud)

每个游戏都使用ManyToMany字段链接到UserDetails.来自game.models的相关代码:

    class Game(models.Model):
        title = models.CharField(max_length=60)
        create_date = models.DateTimeField(auto_now_add=True)
        started = models.BooleanField(default=False)
        players = models.ManyToManyField('user.UserDetails', default=None)
Run Code Online (Sandbox Code Playgroud)

在首页上,我想要一个列出正在进行的所有游戏的表格.在views.py中,我正在使用此命令:

    games_in_signup = Game.objects.filter(started=False)
Run Code Online (Sandbox Code Playgroud)

...并将其传递给模板.最后,在模板中我有这个代码来生成表的行:

    {% for g in games_in_signup %}
    <tr>
        <td>{{ g.title }}</td>
        <td>{{ g.players|first }}</td>
        <td>{{ g.number_of_players }}</td>
        <td>{{ g.players.all|length }}</td>
        <td>{{ g.create_date }}</td>
    </tr>
    {% endfor %}
Run Code Online (Sandbox Code Playgroud)

而不是像我希望的那样给我第一个玩家的用户名,我得到"TypeError at/game /'ManyRelatedManager'对象不支持索引".如果我尝试改变

        <td>{{ g.players|first }}</td>    
Run Code Online (Sandbox Code Playgroud)

...至...

        <td>{{ g.players.all|first }}</td>
Run Code Online (Sandbox Code Playgroud)

...我在/ game /'UserDetails'对象中获得"AttributeError"没有属性'username'" …

python django django-models django-orm django-users

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

是否为未强制执行的模型字段定义了选择?

所以我已经定义了一些字段作为选择:

class MyModel(models.Model):
    # Text language.                                                                                 
    ENGLISH = 'eng'                                                                                   
    FRENCH  = 'fr'                                                                                   

    LANGUAGES_CHOICES = [                                                                            
        (ENGLISH, 'English'),                                                                        
        (FRENCH, 'French'),                                                                          
    ]                                                                                                

    language = models.CharField(                                                                     
            max_length=max(len(language) for language in LANGUAGES_CHOICES),                         
            choices=LANGUAGES_CHOICES,                                                               
            blank=False,                                                                             
            null=True)
Run Code Online (Sandbox Code Playgroud)

但是,我可以做到MyModel(language='hurhurhur').save()没有任何错误或投诉.我错过了什么?

django django-models django-orm

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

如何在Django 1.8中优化迁移

我正在使用Django 1.8,并且在迁移文件夹中有一个包含100多个文件的应用程序.有没有一种方法在Django没有删除文件来"压缩"或"优化"这些迁移,所以我没有这么多?

django django-orm

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

Django:当关系结束被删除时,m2m_changed没有被触发

注意:由于生产环境的限制,我必须坚持django-1.4到目前为止.

我刚刚做了一个测试,看看当ManyToMany改变时我是否可以挂钩事件.

我有一个Group包含几个Item对象的模型.每当项目在任何组中发生变化时,我都希望对相关的Group`实例做一些事情.

from django.db import models
    from django.db.models.signals import m2m_changed, post_delete, pre_delete

class Item(models.Model):
    name = models.CharField(max_length=32)

    def __str__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=32)
    items = models.ManyToManyField(to=Item)    

def items_changed(signal, sender, action, instance, reverse, model, pk_set, using, **kwargs):
    print str(signal)
    print action, instance, reverse, pk_set

m2m_changed.connect(items_changed, sender=Group.items.through)
Run Code Online (Sandbox Code Playgroud)

如果我更改实例items上的列表Group,那么m2m_changed事件显然会被触发.

>>> from sandbox.core.models import Group, Item
>>> item, created = Item.objects.get_or_create(name='f')
>>> g = Group.objects.get(pk=1)
>>> g.items.add(item) …
Run Code Online (Sandbox Code Playgroud)

python django many-to-many signals django-orm

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

Django查询一次获取三个对象

我的应用程序中有一个页面列出了三篇新闻文章,页面底部有导航按钮以获取接下来的三篇或前三篇新闻文章.

我试图想出一个可以解决这个问题的查询,但我不想使用Django Paginator.有什么建议?

python django django-orm

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

用django获取一个物体的孙子

我正在用django构建一个带有以下模型的webapp:

class Business(models.Model):
    ...

class Branch(models.Model):
    business = models.ForeignKey(Business)
    ...

class Event(models.Model):
    branch = models.ForeignKey(Branch)
Run Code Online (Sandbox Code Playgroud)

我的问题是如何通过他们的业务(而不是他们的分支)获取所有事件,以及是否可以在数据库查询中执行此操作.

谢谢!

python sql django django-models django-orm

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