我需要一些帮助来在 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
如何在 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'。我怎样才能达到我想要的?
我有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)
我还注册signal了apps.py一个project_folder:
def ready(self):
from my_app.signals import category_changed
Run Code Online (Sandbox Code Playgroud)
但问题是——这段代码没有任何效果。我改变了Product.category- 并且没有看到任何打印。我应该如何修复它才能使其正常工作?
我的项目中有这个配置:
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 记录器。
我想将一些长查询移至 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)。
有没有办法让这个查询与 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) 我正在努力熟悉Django channels和web-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 …
我已经解决了一些类似的问题,但没有找到任何可行的解决方案。
我尝试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)
但我仍然遇到同样的错误。
我想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 一起使用,我没有找到任何信息。
我正在覆盖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()方法一起工作?
django ×9
python ×9
postgresql ×2
asynchronous ×1
celery ×1
django-views ×1
gwt-gin ×1
logging ×1
many-to-many ×1
overriding ×1
pickle ×1
python-3.x ×1
signals ×1
transactions ×1
websocket ×1