我正在制作一个小词汇测验应用程序,一个单词的基本模型是这样的:
class Word(models.Model):
id = models.AutoField(primary_key=True)
word = models.CharField(max_length=80)
id_image = models.ForeignKey(Image)
def __unicode__(self):
return self.word
class Meta:
db_table = u'word'
Run Code Online (Sandbox Code Playgroud)
我目前正在自我测验的单词模型是这样的:
class WordToWorkOn(models.Model):
id = models.AutoField(primary_key=True)
id_student = models.ForeignKey(Student)
id_word = models.ForeignKey(Word)
level = models.IntegerField()
def __unicode__(self):
return u'%s %s' % (self.id_word.__unicode__(), self.id_student.__unicode__() )
class Meta:
db_table = u'word_to_work_on'
Run Code Online (Sandbox Code Playgroud)
"水平"表示我学到了多少.我已经学过的一组单词有这个模型:
class WordLearned(models.Model):
id = models.AutoField(primary_key=True)
id_word = models.ForeignKey(Word, related_name='word_to_learn')
id_student = models.ForeignKey(Student, related_name='student_learning_word')
def __unicode__(self):
return u'%s %s' % (self.id_word.__unicode__(), self.id_student.__unicode__() )
class Meta:
db_table = u'word_learned'
Run Code Online (Sandbox Code Playgroud)
当WordToWorkOn上的查询集返回时结果太少(因为它们已经足够好地学习以便移动到WordLearned并从WordToWorkOn中删除),我想找到要添加到其中的Word.我不知道一个好方法的部分是将它限制为尚未在WordLearned中的单词.
所以,一般来说,我想我想在一个单词的查询集上做某种类型的.exclude(),但它需要根据WordLearned表中的成员资格进行排除.有没有办法做到这一点?我发现有很多关于加入查询集的参考资料,但是找不到一个关于如何做到这一点的好文章(可能只是不知道要搜索的正确术语). …
如果我对多个表有查询,例如:
d = Relations.objects.filter(follow = request.user).filter(date_follow__lt = last_checked)
r = Reply.objects.filter(reply_to = request.user).filter(date_reply__lt = last_checked)
article = New.objects.filter(created_by = request.user)
vote = Vote.objects.filter(voted = article).filter(date__lt = last_checked)
Run Code Online (Sandbox Code Playgroud)
我希望显示按日期排序的所有结果(我的意思是不列出所有回复,然后是所有投票等).不知何故,我想在一个查询集中"加入所有这些结果".有可能吗?
在模型中我有开始和结束日期.如何获得开始和结束日期的所有元素是不同的.
>>> Entry.objects.exclude(start = end)
>>> NameError: name 'end' is not defined
Run Code Online (Sandbox Code Playgroud)
我不知道请帮忙.
我已经快速浏览了以下文档,看看如何WHERE ... OR在Django中进行查询.但我找不到它,也许我太累了.所以我在这里问它.
我必须遵循数据库架构:
main_account - username invoice - amount - currency: 'EUR' or 'USD' or 'GBP' - username (main_account has many invoices)
我的目标是以美元列出"最高支付者".因此,我必须从发票表中计算每个用户的"total_paid"总和(并考虑货币转换).我也想通过这个"total_paid"来过滤.
我当前的SQL看起来像:
SELECT main_account.username, total_paid
FROM main_account JOIN
(
SELECT username,
(SELECT SUM(amount) FROM invoice WHERE main_account.username = invoice.username AND invoice.currency = 'EUR') AS total_eur,
(SELECT SUM(amount) FROM invoice WHERE main_account.username = invoice.username AND invoice.currency = 'USD') AS total_usd,
(SELECT SUM(amount) FROM invoice WHERE main_account.username = invoice.username AND invoice.currency = 'GBP') AS total_gbp,
(SELECT (IFNULL(total_usd,0) + 1.12 * IFNULL(total_eur,0) + …Run Code Online (Sandbox Code Playgroud) 为了练习我学到的东西,我开始了一个关于房地产网站的django项目.
下一步是构建搜索页面,用户可以选择multiple filters,对于为例,number of rooms,baths,area,city...
在我读的书中,我使用了搜索引擎(带有django haystack的Sorl),所以我想知道是否应该使用它来过滤数据库上的用户条件,或者我是否应该只使用djando查询来保持简单ifs.
你有什么建议我的?
我想通过一个包含数字的字段来命令QuerySet.我有这个代码:
MyTable.objects.all().order_by('my_char_field')
Run Code Online (Sandbox Code Playgroud)
有一些"my_char_field"的例子:
"ver3", "ver10", "x5.1 (1)", "ver4", "x5.1 (2)"
Run Code Online (Sandbox Code Playgroud)
上面代码的顺序结果是:
"ver10", "ver3", "ver4", "x5.1 (1)", "x5.1 (2)"
Run Code Online (Sandbox Code Playgroud)
但我想要的顺序是:
"ver3", "ver4", "ver10", "x5.1 (1)", "x5.1 (2)"
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得自然顺序?
我写了一个查询具有已知查找类型的模型.表示输入类型传递的标志kwargs.下面kwarg将解释查找以及传递的kwargs.
db_hash=True)name=True)124,或134as id=True)例如,只是为了方法调用的名称,
self.check_all_routes("Sam", "452", name=True)
Run Code Online (Sandbox Code Playgroud)
我想重构下面的方法来减少它在违反DRY时产生的混乱.
def check_all_routes(self, driver, route, **kwargs):
_hash = kwargs.get('db_hash')
_name = kwargs.get('name')
_id = kwargs.get('id')
if _hash:
return self.model.objects.filter(
driver__db_hash=driver,
route__db_hash=route
).prefetch_related().select_related().values_list('route_number')
if _name:
return self.model.objects.filter(
driver__name=driver,
route__name=route
).prefetch_related().select_related().values_list('route_number')
if _id:
return self.model.objects.filter(
driver_id=driver,
route_id=route
).prefetch_related().select_related().values_list('route_number')
return self.model.objects.filter(
driver=driver,
route=route
).prefetch_related().select_related().values_list('route_number')
Run Code Online (Sandbox Code Playgroud)
可以做些什么来使它不违反DRY.
我有一个模型,其中包含一个@property当我做类似
vals = MyModel.objects.values()
S / O帖子之类的事情时要包含
的模型,建议这样做的get_queryset方法是通过覆盖manager类的方法,并增加对的调用annotate(xtra_field=...)。
问题是我找不到如何使用模型属性执行此操作的示例。我已经尝试过类似的东西
super(SuperClass, self).get_queryset().annotate(xtra_fld=self.model.xtra_prop)
及其众多变体,但都无济于事。
我认为问题是注释参数的RHS应该是什么?
(而且,是的,我知道还有其他更笨拙的方法可以做到这一点,例如遍历values()返回的收益并随便添加属性。对我来说,这不是一个非常优雅(甚至是Django)的解决方案。
我有一个人物模型。
class Person(models.Model):
name_first = models.CharField(max_length=100)
name_middle = models.CharField(max_length=100, null=True, blank=True)
name_last = models.CharField(max_length=100)
date_birth = models.DateField(null=True, blank=True)
date_death = models.DateField(null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
我正在尝试将其扩展到音乐界的不同角色:作曲家,表演者和赞助人。
一个人可以是一个,两个或所有三个角色。如果某人是表演者,我还需要为该人分配一种或多种乐器。在实例化时,您可能不知道某人是否是表演者。否则他们的角色会随着时间而改变。
我希望能够搜索并显示一个人(如果他是三个人)既是作曲家,钢琴家又是赞助人。例如:贝多芬是指挥,作曲家和钢琴家。
我对实现的最初想法是继承Person类。
class Composer(Person):
pass
class Performer(Person):
instrument = models.ManyToManyField(Instrument, verbose_name=_('instrument'), blank=True,)
class Patron(Person):
pass
class Instrument(models.Model):
name = models.CharField(max_length=100, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
问题1:我应该改用某种抽象模型吗?如果是这样,我将如何处理?
问题2:我如何寻找一个人,并知道他们是否是作曲家,赞助人和/或表演者,以及他们是哪种表演者。
谢谢。
django ×10
django-queryset ×10
python ×2
annotate ×1
django-orm ×1
dry ×1
join ×1
model ×1
mysql ×1
properties ×1
refactoring ×1
sql ×1