标签: django-orm

在 Django 自定义管理器类中使用另一个模型管理器的代码

我有两个模型,比如说,QuestionTopic

我正在尝试向 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。有解决方法吗?

django django-orm django-managers

2
推荐指数
1
解决办法
1114
查看次数

Django:获取最新的不同对象

假设我有一个WeatherReport与领域对象datetemperaturecity

我想获取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)

django django-orm

2
推荐指数
1
解决办法
1066
查看次数

在 Django 中的 M2M 关系上使用“通过”参数的原因

简洁的问题:
在不使用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)

django django-orm django-users django-custom-user

2
推荐指数
1
解决办法
1483
查看次数

在 prefetch_related 之后选择相关

我的模型看起来像:

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 django-orm django-queryset

2
推荐指数
1
解决办法
2899
查看次数

具有多级反向查找的预取对象

我在 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 的限制。任何人都可以对这里可能发生的事情有所了解吗?

谢谢内森

django django-models django-orm django-queryset

2
推荐指数
1
解决办法
1080
查看次数

相关字段查找无效:​​带有 content_type__name 的名称

我有以下...

@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我做错了什么?

python django django-orm

2
推荐指数
1
解决办法
919
查看次数

Django 持久数据库连接线程如何安全?

在 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)

django multithreading django-orm thread-local

2
推荐指数
1
解决办法
1744
查看次数

管理 search_fields 中的 Django UUIDField

在一个模型中,我有一个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

python django django-models django-orm django-admin

2
推荐指数
1
解决办法
1284
查看次数

Django ORM - 左外连接有两列?

这是相关代码:

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?

python sql django django-models django-orm

2
推荐指数
1
解决办法
1908
查看次数

使用 Enum 时 Admin 中的 Django 选择

我有一个模型,我在其中使用 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)

当管理站点呈现对象时,它不允许我保存它?有没有人有类似的问题?

在此处输入图片说明

python django django-models django-orm django-admin

2
推荐指数
1
解决办法
1665
查看次数