给定一个对象:
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模型:
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可以是1或2(春天或秋天).现在我想列出有讲座的所有术语,例如((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而变慢.
假设模型X有一个字段n(一个整数)。现在我还有一个Y包含字段n和m(整数)的模型。是否有可能使用 Django ORM 来选择x(model X) 使得存在y(model Y)x.n = y.n并且y.m = m对于给定的值m?
请不要建议我介绍ForeignKey两个模型之间的关系或类似的东西。我想特别知道是否可以在不修改模型的情况下实现这一点。在我正在处理的确切情况下,给定的关系是通用的。通用关系的另一面可以是任何东西,所以根据文档,我不能GenericRelation在不同的模型中多次引入。
我需要在多对多关系上设置自定义保存和删除方法.
我尝试使用"通过"属性指定一个模型,但这使我的代码过于复杂并引入了一些问题.我在多对多模型上不需要任何额外的字段,只需要自定义保存和删除方法.
是否可以在不指定"通过"属性的情况下完成此操作?
这是代码:
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 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'" …
所以我已经定义了一些字段作为选择:
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 1.8,并且在迁移文件夹中有一个包含100多个文件的应用程序.有没有一种方法在Django没有删除文件来"压缩"或"优化"这些迁移,所以我没有这么多?
注意:由于生产环境的限制,我必须坚持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) 我的应用程序中有一个页面列出了三篇新闻文章,页面底部有导航按钮以获取接下来的三篇或前三篇新闻文章.
我试图想出一个可以解决这个问题的查询,但我不想使用Django Paginator.有什么建议?
我正在用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)
我的问题是如何通过他们的业务(而不是他们的分支)获取所有事件,以及是否可以在数据库查询中执行此操作.
谢谢!