小编Chi*_*fir的帖子

在视图中使用全文搜索 + GIN (Django 1.11)

我需要一些帮助来在 django 视图中使用 GIN 索引为全文搜索构建正确的查询。我有一个相当大的数据库(约 40 万行),需要对其中的 3 个字段进行全文搜索。尝试使用django 文档搜索,这是 GIN 之前的代码。它有效,但需要 6 秒以上的时间来搜索所有字段。接下来,我尝试实现GIN索引以加快搜索速度。已经有很多问题如何构建它。但我的问题是 -使用 GIN 索引进行搜索时,视图查询如何更改?我应该搜索哪些字段?

在 GIN 之前:

models.py

class Product(TimeStampedModel):
    product_id = models.AutoField(primary_key=True)
    shop = models.ForeignKey("Shop", to_field="shop_name")
    brand = models.ForeignKey("Brand", to_field="brand_name")
    title = models.TextField(blank=False, null=False)
    description = models.TextField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

视图.py

   
def get_cosmetic(request):
    if request.method == "GET":
        pass
    else:
        search_words = request.POST.get("search")
        search_vectors = (
            SearchVector("title", weight="B")
            + SearchVector("description", weight="C")
            + SearchVector("brand__brand_name", weight="A")
        )

        products = (
            Product.objects.annotate(
                search=search_vectors, rank=SearchRank(search_vectors, search)
            ) …
Run Code Online (Sandbox Code Playgroud)

postgresql gwt-gin django-models django-queryset django-views

7
推荐指数
1
解决办法
3730
查看次数

DRF 更改自定义操作的默认视图集的 lookup_field

如何在 DRF 视图集中更改自定义操作的默认查找参数?这是我的视图集(简化)

class InvitationViewSet(MultiSerializerViewSet):   
    queryset = Invitation.objects.all()  

    @action(
        detail=False,
        #url_path='accept-invitation/<str:key>/',
        #lookup_field='key'
    )
    def accept_invitation(self, request, key=None):
        invitation = self.get_object()
        with legal_invitation(invitation):
            serializer = self.get_serializer(invitation)
            invitation.accepted = True
            invitation.save()
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

我希望当用户输入 url 时/invitations/accept-invitation/abccba,其中abccba是随机令牌字符串。key- 是邀请模型中的一个独特字段。我知道我可以设置 per-Viewset lookup_field='key',但我希望所有其他操作仍然使用 default lookup_field='pk'。我怎样才能达到我想要的?

python django django-rest-framework

6
推荐指数
1
解决办法
2082
查看次数

Django 发出多对多变更信号

我有3个型号:

class Product(TimeStampedModel):
    category = models.ForeignKey('Category', related_name='products', to_field='category_name')
    brand = models.ForeignKey('Brand', related_name='products', to_field='brand_name')

class Brand(models.Model):    
    brand_name = models.CharField(max_length=50)
    categories = models.ManyToManyField('Category', related_name='categories')

class Category(models.Model):
    category_name = models.CharField(max_length=128)
Run Code Online (Sandbox Code Playgroud)

我想Brand-Category在更改后更新 M2M 关系Product.category
我尝试连接信号,就像文档m2m_changed中描述的那样:

@receiver(m2m_changed, sender=Brand.categories.through)
def category_changed(sender, **kwargs):
    print("Signal connected!")
Run Code Online (Sandbox Code Playgroud)

我还注册signalapps.py一个project_folder

  def ready(self):
        from my_app.signals import category_changed
Run Code Online (Sandbox Code Playgroud)

但问题是——这段代码没有任何效果。我改变了Product.category- 并且没有看到任何打印。我应该如何修复它才能使其正常工作?

python django many-to-many signals

5
推荐指数
1
解决办法
7192
查看次数

在 Django 项目中设置日志文件最大大小

我的项目中有这个配置:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'WARNING',
            'class': 'logging.FileHandler',
            'filename': os.path.join(BASE_DIR, 'debug.log'),
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'WARNING',
            'propagate': True,
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

现在它的大小不受控制地增长。有没有办法控制debug.log文件的大小?在 Django 项目中操作日志文件的最佳方式是什么?
我发现了类似的问题,但我没有直接调用 python 记录器。

python django logging

4
推荐指数
1
解决办法
2094
查看次数

在 Django 1.11 中将 QuerySet 传递给 Celery 任务

我想将一些长查询移至 Celery 中的异步任务,然后使用 AJAX 检索该额外信息。现在我得到这样的 QuerySet:

brands = Brand.objects.filter(shops__shop_name__in=[shop])
Run Code Online (Sandbox Code Playgroud)

任务:

@task()
def brand_count(querystr):
    querystr.annotate(amount_of_products=Count('products'))
Run Code Online (Sandbox Code Playgroud)

我想在这里这样做:

task_run = brand_count.delay(brands)
Run Code Online (Sandbox Code Playgroud)

问题是:如何将 QuerySet 传递给 Celery 任务?现在它抛出一个错误,表明无法完成此操作。

发现可能pickle会在这里使用,但我无法找到正确的使用方法。特别是- 是什么# Assuming 's' is the pickled string.意思query = pickle.loads(s)

python django asynchronous pickle celery

3
推荐指数
1
解决办法
1662
查看次数

在 Django 查询中使用 max()

有没有办法让这个查询与 Django 一起工作?

stage = Task.objects.filter(id = input_stage.id)\
            .update(start_date = max(data.get('start_date'), F('start_date')),
                    finish_date = max(data.get('finish_date'), F('finish_date')))
Run Code Online (Sandbox Code Playgroud)

现在我收到一个错误:

TypeError: '>' not supported between instances of 'F' and 'datetime.date'
Run Code Online (Sandbox Code Playgroud)

python django django-queryset

3
推荐指数
1
解决办法
520
查看次数

带有 Django 通道的恒定数据流

我正在努力熟悉Django channelsweb-sockets。我有一个任务 - 不断地向连接到频道的任何人流式传输数据。
目前,这是来自官方教程的一段代码,有一些改进。

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = f'chat_{self.room_name}'

        if not hasattr(self, 'vehicle'):
            # this produses constant data stream
            self.vehicle = connect('/dev/ttyACM0', wait_ready=True, rate=4)

        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )

        await self.accept()

        # this part does not work!
        await self.send(text_data=json.dumps({
            'message': {
                        'mess': "Hi",
                        'yaw': self.vehicle._yaw,
                        'pitch': self.vehicle._pitch,
                        'roll': self.vehicle._roll,
                       }
        }))


    async def disconnect(self, close_code):
        # Leave room group
        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )
Run Code Online (Sandbox Code Playgroud)

但是现在这段代码断开连接,前面没有显示任何内容。我找到了这个答案,但那个循环也不起作用。
如果我将 while …

python django websocket django-channels

3
推荐指数
1
解决办法
2319
查看次数

pg_dump:命令行参数太多(第一个是“--host=localhost”)

我已经解决了一些类似的问题,但没有找到任何可行的解决方案。

我尝试djang-dbbackup在我的 Django 项目中使用模块。我运行$ python manage.py dbbackup并收到此错误:

CommandConnectorError: Error running:  pg_dump last_cosmetics --host=localhost --username=postgres --no-password --clean 
b'pg_dump: too many command-line arguments (first is "--host=localhost")\r\nTry "pg_dump --help" for more information.\r\n'
Run Code Online (Sandbox Code Playgroud)

我还尝试在 Windows cmd 上运行它。

pg_dump last_cosmetics --host=localhost --username=postgres --no-password --clean
Run Code Online (Sandbox Code Playgroud)

但我仍然遇到同样的错误。

python django postgresql database-backups

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

DRF 操作中的原子事务?

我想Django atomic transactions在第一时间进入。我想知道是否有可能像这样使用它:

class TaskViewSet(MultiSerializerViewSet):
    @transaction.atomic
    @action(methods=['PATCH'], detail=True)
    def move_task(self, request, pk):
        # making queries, trying to update them, roll back if last one fails.    
        return Response("message: SUCCESS", status=_status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

我搜索了一些 - 有一些关于如何使用事务的信息,但如果可以将它们与 DRF 一起使用,我没有找到任何信息。

python django django-rest-framework

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

Transaction.atomic 同时重写 Django 模型中的 save() 方法?

我正在覆盖save()模型中的默认方法,并在那里创建一个相关的模型实例:

def save(self, *args, **kwargs):
    super().save(*args, **kwargs)
    parent_folder = None
    if self.parent:
        parent_folder = self.parent.task_folders.all().first()

    folder, created = Folder.objects.get_or_create(
        project=self.project,
        task=self,
        parent=parent_folder,
        defaults={'name': self.name,
                  'project': self.project,
                  'task': self,
                  'creator': self.creator,
                  'parent': parent_folder,
                  'is_root': True
                  })
Run Code Online (Sandbox Code Playgroud)

问题是 - 我应该transaction.atomic在这里使用吗?它如何与save()方法一起工作?

python django overriding transactions python-3.x

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