我对构建Django查询的最佳方法感到困惑,该查询检查字段(或列表)的所有元素ManyToMany是否存在于另一个ManyToMany字段中.
举个例子,我有几个Person,可以有多个专业.也有Jobs表示人们就可以开始,但他们需要一个或多个Specialtys到有资格被启动.
class Person(models.Model):
name = models.CharField()
specialties = models.ManyToManyField('Specialty')
class Specialty(models.Model):
name = models.CharField()
class Job(models.Model):
required_specialties = models.ManyToManyField('Specialty')
Run Code Online (Sandbox Code Playgroud)
一个人只有拥有工作所需的所有专业,才能开始工作.所以,再举一个例子,我们有三个专长:
我有一个Job需要唱歌和舞蹈的专业.有歌唱和舞蹈专业的人可以开始,但另一个有编码和歌唱专业的人不能 - 因为工作需要一个可以唱歌和跳舞的人.
所以,现在我需要一种方法来找到一个人可以承担的所有工作.这是我解决问题的方法,但我确信这是一种更优雅的方法:
def jobs_that_person_can_start(person):
# we start with all jobs
jobs = Job.objects.all()
# find all specialties that this person does not have
specialties_not_in_person = Specialty.objects.exclude(name__in=[s.name for s in person.specialties])
# and exclude jobs that require …Run Code Online (Sandbox Code Playgroud) 我有以下模型(为了这个问题的目的大大简化):
class Product(models.Model):
price = models.DecimalField(max_digits=8, decimal_places=2)
sale_price = models.DecimalField(max_digits=10, blank=True, null=True, decimal_places=2)
Run Code Online (Sandbox Code Playgroud)
对于大多数产品,价格将被填补,但sale_price将不会.所以,我可以按价格订购产品:
Product.objects.order_by('price')
Product.objects.order_by('-price')
Run Code Online (Sandbox Code Playgroud)
但是,有些产品会有sale_price,我找不到一种方法来整齐地订购这些产品,以便销售价格与正常价格交错.如果我尝试按两个字段排序:
Product.objects.order_by('sale_price','price')
Run Code Online (Sandbox Code Playgroud)
...然后,所有未售出的产品一起显示,然后是所有产品,而不是交叉价格.
这有意义吗?有没有人有办法解决这个问题?
谢谢!
是否可以将Django模型设为只读?没有创建,更新等
注意这个问题不同于:
将Django模型设为只读?(这个问题允许创建新记录)
整个模型为只读(仅涉及Django管理界面 - 我希望模型只能在整个应用程序中读取)
是否可以为自定义事务设置隔离级别(但不能使用原始sql)?
例如,类似于:
with transaction.commit_on_success(isolation='SERIALIZABLE'):
bla
Run Code Online (Sandbox Code Playgroud) Django 1.8 将带有新的高级字段类型,包括依赖于PostgreSQL的ArrayField,并在数据库级别实现.
PostgreSQL的数组字段实现了一个append方法.
但是,我找不到任何关于附加项目的文档ArrayField.这显然非常有用,因为它允许更新字段而不将其全部内容从数据库转移回数据库.
这可能吗?如果不是将来可能的话?任何指向我错过的文档的指针都将非常感激.
为了澄清我的要求,这将是伟大的:
注意:这是幻想代码,我认为不会工作(我没试过)
# on model:
class Post(models.Model):
tags = ArrayField(models.CharField(max_length=200))
# somewhere else:
p = Post.objects.create(tags=[str(i) for i in range(10000)])
p.tags.append('hello')
Run Code Online (Sandbox Code Playgroud)
目前有没有办法做到这一点,而不诉诸原始的SQL?
为了将我的模型子文件夹中我试图用app_label元字段描述这里.
我的目录结构如下所示:
在bar_model.py中,我将我的模型定义为:
from django.db import models
class SomeModel(models.Model):
field = models.TextField()
class Meta:
app_label = "foo"
Run Code Online (Sandbox Code Playgroud)
我可以像这样成功导入模型:
from apps.foo.models.bar_model import SomeModel
Run Code Online (Sandbox Code Playgroud)
但是,运行:
./manage.py syncdb
Run Code Online (Sandbox Code Playgroud)
不会为模型创建表.在详细模式中,我确实看到应用程序"foo"被正确识别(它在settings.py中的INSTALLED_APPS中).将模型移动到foo下的models.py确实有效.
是否有一些特定的约定没有记录在app_label中,或者整个机制阻止了这个模型结构被syncdb识别?
我想在我的Django应用程序中实现关注者/关注功能.
我为每个用户(django.contrib.auth.User)提供了一个UserProfile类:
class UserProfile(models.Model):
user = models.ForeignKey(User, unique = True, related_name = 'user')
follows = models.ManyToManyField("self", related_name = 'follows')
Run Code Online (Sandbox Code Playgroud)
所以我试着在python shell中这样做:
>>> user_1 = User.objects.get(pk = 1) # <-- mark
>>> user_2 = User.objects.get(pk = 2) # <-- john
>>> user_1.get_profile().follows.add(user_2.get_profile())
>>> user_1.get_profile().follows.all()
[<UserProfile: john>]
>>> user_2.get_profile().follows.all()
[<UserProfile: mark>]
Run Code Online (Sandbox Code Playgroud)
但正如您所看到的,当我向用户的follows字段添加新用户时,还会在另一侧添加对称关系.从字面上看:如果user1跟随user2,user2也跟随user1,这是错误的.
哪里是我的错?你有没有办法实施粉丝并正确遵循?
感谢你们.
我有一个看起来像这样的模型:
Requests: user, req_time, req_text
Run Code Online (Sandbox Code Playgroud)
在数据库中,记录可能如下所示:
id, user_id, req_time, req_text
1 1 TIMESTAMP YES
2 1 TIMESTAMP NO
3 2 TIMESTAMP YES
Run Code Online (Sandbox Code Playgroud)
等等
如何编写Django ORM查询:按用户对请求进行分组,根据req_text过滤请求,还可以选择结果结果集的最大ID.因此,对于每个用户,我将返回一行符合过滤条件并且具有最大id.
是否有可能在django ORM中复制这种特定的sql顺序:
order by
(case
when id = 5 then 1
when id = 2 then 2
when id = 3 then 3
when id = 1 then 4
when id = 4 then 5
end) asc
Run Code Online (Sandbox Code Playgroud)
?
看起来Django默认会添加ORDER BY到查询中.我可以清除它吗?
from slowstagram.models import InstagramMedia
print InstagramMedia.objects.filter().query
Run Code Online (Sandbox Code Playgroud)
SELECT
`slowstagram_instagrammedia`.`id`,
`slowstagram_instagrammedia`.`user_id`,
`slowstagram_instagrammedia`.`image_url`,
`slowstagram_instagrammedia`.`video_url`,
`slowstagram_instagrammedia`.`created_time`,
`slowstagram_instagrammedia`.`caption`,
`slowstagram_instagrammedia`.`filter`,
`slowstagram_instagrammedia`.`link`,
`slowstagram_instagrammedia`.`attribution_id`,
`slowstagram_instagrammedia`.`likes_count`,
`slowstagram_instagrammedia`.`type`
FROM
`slowstagram_instagrammedia`
ORDER BY
`slowstagram_instagrammedia`.`id`
ASC
Run Code Online (Sandbox Code Playgroud)
```
django-orm ×10
django ×9
python ×3
django-1.8 ×1
postgresql ×1
readonly ×1
sql-order-by ×1
transactions ×1