我有两个模型,比如说,Question和Topic。
我正在尝试向 Question 模型的自定义管理器添加方法,例如某些通过Topic.
我似乎无法为此使用其他经理的代码(也不能import Topic,所以我做不到Topic.objects...)
在 class QuestionManager
def my_feed(self, user):
topics = TopicManager().filter(user=user) # 1st approach
#topics = Topic.objects.filter(user=user) # 2nd line
# do something with topics
Run Code Online (Sandbox Code Playgroud)
类 TopicManager ....
使用第一种方法,我收到以下错误:
virtualenv/local/lib/python2.7/site-packages/django/db/models/sql/query.pyc in get_meta(self)
219 by subclasses.
220 """
--> 221 return self.model._meta
222
223 def clone(self, klass=None, memo=None, **kwargs):
AttributeError: 'NoneType' object has no attribute '_meta'
Run Code Online (Sandbox Code Playgroud)
我不能使用第二行,因为我不能导入 Topic,因为 Topic 依赖于这个文件中的 TopicManager。有解决方法吗?
假设我有一个WeatherReport与领域对象date,temperature和city。
我想获取WeatherReport每个城市的所有最新对象。我想我会做类似的事情
WeatherReport.objects.order_by('-date').distinct('city')
Run Code Online (Sandbox Code Playgroud)
但这失败了,返回错误
ProgrammingError: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
Run Code Online (Sandbox Code Playgroud) 简洁的问题:
在不使用through参数的情况下,在外部表上对 Django (1.5) 中的多对多关系建模有什么优点和缺点?
详细信息:
说,我有一个自定义用户模型UserProfile,我想定义与同一模型的 m2m 关系,例如实现以下关系。我可以像这样定义一个外部表(模型):
class Relationship(models.Model):
"""Relationship model"""
from_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='from_users')
to_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='to_users')
created = models.DateTimeField(auto_now_add=True)
is_blocked = models.BooleanField(default=False)
objects = RelationshipManager()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我应该向 UserProfile 模型添加一个 m2m 字段,如下所示?如果是,为什么?我只能使用关系模型处理用户之间的所有关系,不是吗?
class UserProfile(AbstractBaseUser, PermissionsMixin):
user_following = models.ManyToManyField('self', through=Relationship, symmetrical=False, related_name='followed')
Run Code Online (Sandbox Code Playgroud) 我的模型看起来像:
class Book(models.Model):
publisher = models.ForeignKey(Publisher) # This is not important
class Baz(models.Model):
a = models.CharField(max_length=100)
class Page(models.Model):
book = models.ForeignKey(Book)
baz = models.ForeignKey(Baz)
Run Code Online (Sandbox Code Playgroud)
我正在尝试运行这样的查询:
[[x.baz.a for x in y.page_set.all()]
for y in Book.objects.all().prefetch_related('page_set', 'page_set__baz')]
Run Code Online (Sandbox Code Playgroud)
我认为 ORM 应该能够执行两个查询: ( Page JOIN Baz) 和Book. 最后的连接应该在 Python 中进行。相反,我看到 ORM 执行了三个查询。我相信我必须知道如何使用select_related,但这也不起作用(select_related之前也没有移动prefetch_related):
Book.objects.all().prefetch_related('page_set', 'page_set__baz').select_related('page_set__baz')
Run Code Online (Sandbox Code Playgroud)
查询(uploads是应用程序):
QUERY = u'SELECT "uploads_book"."id", "uploads_book"."publisher_id" FROM "uploads_book"' - PARAMS = (); args=()
QUERY = u'SELECT "uploads_page"."id", "uploads_page"."book_id", "uploads_page"."baz_id" …Run Code Online (Sandbox Code Playgroud) 我在 Django 1.7 上并且一直在使用新的Prefetch对象,这是一个很好的补充。然而,当我需要遍历不止一种关系时,我似乎被卡住了。这是我的代码:
product_types = self.get_queryset().select_related().prefetch_related(
'excise_category__exciseitem_set__unit',
Prefetch(
'bevtank_set__package_set__checkout_set',
queryset=CheckOut.objects.filter(
create_date__lte=end_date,
submission__isnull=True,
exempt=False),
to_attr='checkouts_due'
)
)
...
for pt in product_types:
...
co = pt.checkouts_due
...
Run Code Online (Sandbox Code Playgroud)
这给了我一个'ProductType' object has no attribute 'checkouts_due'关于co = pt.checkouts_due. 如果我将查找减少到单个反向查找(出于调试目的),它可以正常工作。
所以要么是我的代码有问题,要么是 Prefetch 的限制。任何人都可以对这里可能发生的事情有所了解吗?
谢谢内森
我有以下...
@receiver(post_save)
def po_save(sender, instance, created, **kwargs):
Event.objects.get(content_type__name=sender.__name__)
Run Code Online (Sandbox Code Playgroud)
这给出了错误:相关字段得到无效查找:名称。
content_type__name但是我使用 content_type似乎有问题,name我做错了什么?
在 django 中,持久的数据库连接由threading.local. 此代码驻留在类中django.db.utils.ConnectionHandler。由于此类在django.db.__init.__.py其中实例化,因此当我们执行import django.db. 这会在请求/响应周期中的某个地方发生。对于同一线程甚至同一进程中的不同线程中的后续请求,django.db.__init__.py将不会执行,因为它已经加载。
所以我的问题是它不会共享同一进程中所有线程的连接。我在这里错过了什么吗?
我认为像下面这样的东西应该可以正常工作
# file db/__init__.py
connections = threading.local()
connections.connections = ConnectionHandler()
Run Code Online (Sandbox Code Playgroud) 在一个模型中,我有一个UUIDField这样的:
uuid = models.UUIDField(_('UUID'), primary_key=True, default=uuid.uuid4, editable=False)
Run Code Online (Sandbox Code Playgroud)
在相应的管理中,我会按 uuid 值进行搜索。所以我有:
class MyAdmin(admin.ModelAdmin):
search_fields = ('uuid',)
Run Code Online (Sandbox Code Playgroud)
但以这种方式它不会产生任何结果。我需要考虑一下吗?我使用 Django 1.11
这是相关代码:
class Book(models.Model):
name = models.CharField(max_length=50)
class BookNote(models.Model):
text = models.CharField(max_length=50)
book = models.ForeignKey(Book)
user = models.ForeignKey(settings.AUTH_USER_MODEL)
class Meta:
unique_together = [('book', 'user'), ]
Run Code Online (Sandbox Code Playgroud)
现在,对于网站中的特定用户:
我想查询所有书籍(所有表格)。并且,
对于每个 book 对象,如果用户有这本书的 BookNote - 获取它,否则 booknote 应该为 null。
这就是我将如何使用 SQL(有效)做到这一点:
SELECT book.name, booknote.text
FROM book
LEFT OUTER JOIN booknote ON
(book.id = booknote.book_id AND booknote.user_id = {user_id_here})
Run Code Online (Sandbox Code Playgroud)
这是我尝试过,也没有工作:
qs = Book.objects.filter(Q(booknote__user_id=user_id_here) | Q(booknote__isnull=True))
Run Code Online (Sandbox Code Playgroud)
我检查了一下qs.query,我明白了为什么 - Django 使用 WHERE 子句来过滤 user_id,所以我没有得到所有的书。
如何使用 django ORM 执行相同的查询?没有原始sql?
我有一个模型,我在其中使用 Enum 进行选择:
class Agreement(models.Model):
class Category(enum.Enum):
EULA = 0
PROVIDER = 1
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
category = models.IntegerField(
choices=[(choice.name, choice.value)
for choice in Category])
title = models.CharField(max_length=128)
content = models.TextField()
Run Code Online (Sandbox Code Playgroud)
我使用简单的管理站点注册来注册它:
admin.site.register(Agreement)
Run Code Online (Sandbox Code Playgroud)
当管理站点呈现对象时,它不允许我保存它?有没有人有类似的问题?