我有一个模型 Foo。这与 Moo 有着多对多的关系。
现在 Foo 在其多对多字段中有许多对象,即它有 moo1、moo2、moo3 等,如何一起删除所有对象?我知道我们可以单独删除每个。
foo = FOO()
foo.save()
foo.moo.add(moo1)
foo.moo.remove(moo1)
Run Code Online (Sandbox Code Playgroud)
IE
foo = FOO()
foo.save()
foo.moo.add(moo1)
foo.moo.add(moo2)
foo.moo.reset() # This should remove all objects that have been added
# in this field. This does not work but I want
# something like this.
Run Code Online (Sandbox Code Playgroud) 我有三个数据库,我想根据一个请求在事务中向它们添加数据。
\n\n例如我的代码。
\n\n@transaction.commit_manually\ndef my_view(request):\n try:\n MyModel_one(...).save(using='default')\n MyModel_two(...).save(using='db_one')\n MyModel_three(...).save(using='db_two') # <-- for example we make exception here (duplicate data)\n except IntegrityError:\n transaction.rollback()\n transaction.rollback(using='db_one')\n transaction.rollback(using='db_two')\n return ...\n transaction.commit()\n transaction.commit(using='db_one')\n transaction.commit(using='db_two')\n return ...\nRun Code Online (Sandbox Code Playgroud)\n\n结果:
\n\n问题:为什么交易在这里不起作用?我该怎么做才能获得工作交易?
\n\n(我尝试使用其他方法,但没有成功)\n(而且我知道这不是漂亮的代码,但对于理解问题来说非常简单)
\n\nDjango 1.7.7\nPython 2.7
\n\n数据库:\n默认 \xe2\x80\x94 postgres\ndb_one \xe2\x80\x94 mysql\ndb_two \xe2\x80\x94 mysql
\n我正在配置一个 API 来提取结果列表。这些物品是服装“产品”,有多种“变体”。
我试图使用unique来确保查询集仅返回唯一产品的列表 - 而不是由于许多变化而重复多次的同一产品。
过去,我在产品的主键(id)上使用了distinct。但是,下面的代码不起作用。
当我尝试使用“distinct”时,出现 500 错误。没有它-我不会得到任何错误。我无法在本地测试,因为 SQLite 不喜欢不同的。我在用
class InternalListView(APIView):
renderer_classes = (JSONRenderer, )
def get(self, request, *args, **kwargs):
filters = {}
for key, value in request.GET.items():
key = key.lower()
if key in countmatch:
lookup, val = internalmatch[key](value.lower())
filters[lookup] = val
qset = (
Product.objects
.filter(**filters)
.distinct('id')
.order_by('-rating')
.values('name', 'brand', 'rating')
.annotate(
price=F('variation__price__price'),
id=F('pk'),
vari=F('variation'),
)
)
for i in qset:
i['likes'] = random.randint(500, 1000)
print qset
return Response(qset.all())
Run Code Online (Sandbox Code Playgroud) 我有一个模型,其实例永远不需要写入数据库。它们是动态生成的,成本非常低,而且几乎永远不会改变。
我希望通过 ORM 查询这些实例,并在 django-admin 中浏览它们(只读+mass_actions,不需要 CRUD)。
据我所知,SQLite 在运行测试时使用内存数据库。我想我想使用这个功能,但不仅仅限于测试。
另一种选择可能是纯内存模型后端,但我没有找到。实际上我确实找到了这个项目: https: //github.com/felipecruz/dmqs但它看起来有点过时了。
或者也许有一个缓存后端可以做到这一点?
我的内容模型与标签模型具有多对多关系。当我保存内容对象时,我想动态添加关系。我按照以下方式执行此操作。
# models.py
def tag_content(content_id):
obj = Content.objects.get(pk=content_id)
print obj # Checking
obj.tags = [1, 2, 3] # Adding the relationships using the Tag IDs
class Tag(models.Model):
name = models.CharField(max_length=255)
class Content(models.Model):
title = models.CharField(max_length=255)
is_tagged = models.BooleanField(default=False)
tags = models.ManyToManyField(Tag, blank=True)
def save(self, *args, **kwargs):
super(Content, self).save(*args, **kwargs)
if not self.is_tagged:
tag_content(self.pk) # calling the tagging method
Run Code Online (Sandbox Code Playgroud)
换句话说,当一个Content对象被保存时,它的tags字段与3个不同的Tag对象模型相关。只是为了让您知道,我的数据库中确实有 pks = 1、2 和 3 的标签。
然而,这根本行不通。save 方法调用 tag_content 方法,因为 print obj 语句有效。但是,多对多字段未设置并且仍为空。有趣的是,如果我在 shell 中运行以下命令,标签字段就会完美设置。
# python manage.py shell
from myapp.models …Run Code Online (Sandbox Code Playgroud) 这是我的查询
SELECT * FROM `music` where lower(music.name) = "hello"
我怎样才能用 django 发送这个查询
我尝试了这个,但它没有在查询中添加更低的值
>>> Music.objects.filter(name__iexact="hello")
(0.144) SELECT `music`.`id`, `music`.`name`, `music`.`artist`, `music`.`image`, `music`.`duration`, `music`.`release_date`, `music`.`is_persian` FROM `music` WHERE `music`.`name` LIKE 'hello' LIMIT 21; args=('hello',)
<QuerySet []>
Run Code Online (Sandbox Code Playgroud) 我有一个这样的模型:
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
class Meta:
db_table = 'article'
Run Code Online (Sandbox Code Playgroud)
我写了查询:
articles = Article.objects.filter(title__iexact='hello world')
print(articles.query)
Run Code Online (Sandbox Code Playgroud)
输出是:
SELECT ... FROM `article` WHERE `article`.`title` LIKE hello world
Run Code Online (Sandbox Code Playgroud)
可以看到iexact被翻译成了LIKE。但是 django 文档说它将转换为 ILIKE,谁错了?
顺便一提:
我的 mysql 排序规则是 utf8_bin。
mysql 在 ubuntu 上提供服务。
代码在windows上运行。
我有一个这样的模型:
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
create_time = models.DateTimeField(auto_now_add=True,null=True)
Run Code Online (Sandbox Code Playgroud)
我在视图函数中编写了一条查询语句,如下所示:
from datetime import time
start_time = time(hour=17)
end_time = time(hour=18)
articles = Article.objects.filter(create_time__time__between=(start_time,end_time))
Run Code Online (Sandbox Code Playgroud)
但是Django引发异常django.core.exceptions.FieldError: Unsupported lookup 'between' for TimeField or join on the field not permitted.,django文档说这是正确的。如果我想要过滤时间在17到18之间,我该怎么办?
我正在尝试返回每个UserProfile,其中有一对多Subscription,有一个外键 和Artist,UserProfile每个艺术家有很多ReleaseGroup,每个人拥有的未来发行组的数量。UserProfile
简而言之:我想返回每个用户拥有的所有订阅的即将发布版本的总数。
然而,在我数数之前我就被困住了......
context['test_totals'] = UserProfile.objects.prefetch_related(
Prefetch('subscription_set', queryset=Subscription.objects.
prefetch_related(Prefetch('artist', queryset=Artist.objects.
prefetch_related(Prefetch('release_groups',
queryset=ReleaseGroup.objects.filter(
release_date__gte=startdate
), to_attr='rggg')), to_attr='arti')), to_attr='arts'))
Run Code Online (Sandbox Code Playgroud)
在模板中访问userprofile.arts|length会返回订阅总数,但rggg不会arti返回任何内容。如何才能做到这一点?
我尝试使用 )` 对自身进行过滤filter(profile='userprofile,但这会返回错误。如果我可以自我过滤,我可能可以让它发挥作用吗?
我想在 django ORM 中创建一个类似这样的查询。
SELECT COUNT(CASE WHEN myCondition THEN 1 ELSE NULL end) as numyear
FROM myTable
Run Code Online (Sandbox Code Playgroud)
以下是我编写的 djang ORM 查询
year_case = Case(When(added_on__year = today.year, then=1), output_field=IntegerField())
qs = (ProfaneContent.objects
.annotate(numyear=Count(year_case))
.values('numyear'))
Run Code Online (Sandbox Code Playgroud)
这是由 django orm 生成的查询。
SELECT COUNT(CASE WHEN "analyzer_profanecontent"."added_on" BETWEEN 2020-01-01 00:00:00+00:00 AND 2020-12-31 23:59:59.999999+00:00 THEN 1 ELSE NULL END) AS "numyear" FROM "analyzer_profanecontent" GROUP BY "analyzer_profanecontent"."id"
Run Code Online (Sandbox Code Playgroud)
所有其他事情都很好,但是 django在最后放置了一个GROUP BY导致多行和错误答案。我根本不想那样。现在只有一列,但我会放置更多这样的列。
根据评论进行编辑 我将使用 qs 变量来获取我的分类在当前年、月、周的值。
更新 根据我来到这里的评论和答案,让我澄清一下。我只想在数据库端执行此操作(显然使用 Django ORM 而不是 RAW SQL)。它是一个简单的 sql 查询。由于数据可能太大,在 Python 端做任何事情都是低效的。这就是为什么我希望数据库根据 CASE …
django ×10
django-orm ×10
python ×2
django-cache ×1
many-to-many ×1
mysql ×1
orm ×1
postgresql ×1
python-3.x ×1
sql ×1