小编D_P*_*D_P的帖子

如何使用bulk_update一次更新多个模型对象?

前端用户给出这样的输入值:['1','2','3']。我想同时更新多个对象bulk_update,我尝试了这样的操作,但这给了我这个错误。

ValueError: All bulk_update() objects must have a primary key set.

通过这种类似的方式,我使用bulk_create工作正常的方法创建了对象,但使用bulk_update它却不起作用。

这里我想一次更新多个具有不同值的模型对象?

class PVariant(models.Model):
    name = models.CharField(max_length=255)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    ....

#views

quantity = request.POST.getlist('quantity')
#['1','2','3']
names = request.POST.getlist('names')
fields = ['name', 'price', 'quantity'..]
params = zip(names, quantity, weight,..)
variants = [PVariant(name=param[0],sku=param[1], quantity=param[2], weight=param[3],
                                       product=product) for param in params]
PVariant.objects.bulk_update(variants, fields)
          
Run Code Online (Sandbox Code Playgroud)

编辑: 从客户端我在视图中获取此类数据。

['name1', 'name2'] names
['12', '1213.0'] field1
['12.0', '12.0']  field2
['1244', '1244']  field3
['11', '11']   field4
['12.0', '12.0'] field5
Run Code Online (Sandbox Code Playgroud)

python django django-models django-views

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

如何更改默认权限名称?

我想在迁移 django 模型后更改 django 创建的默认权限名称。

文档说在课堂上提供是有效的但是default_permissions = []Meta

必须在通过 migrate 创建模型之前在模型上指定它,以防止创建任何遗漏的权限。

但是模型迁移后是否也可以更改权限名称(如果可能的话也可以更改代号)?

 class ContactPage(models.Model):
        full_name = models.CharField(max_length=255)
        email = models.EmailField()
        msg = models.TextField()
        sent_on = models.DateTimeField(auto_now_add=True)

        def __str__(self):
            return self.full_name

        class Meta:
            default_permissions = [] # works in the first migrate
            permissions = [
                ('can_view_contacts', 'Can View Contacts'),
                ('can_delete_contacts', 'Can Delete Contacts'),
            ]
Run Code Online (Sandbox Code Playgroud)

django django-authentication

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

'tuple' 对象在更新图像对象时没有属性 '_committed' 错误?

在这里,我试图更新特定产品的每个产品图像。但它不能正常工作。这里只有第一个对象的图像正在更新。

有一个模板,我们可以在其中一次更新产品和产品图片。与模型ProductImageManyToOne关系,Product因此在模板中可以有单个产品的多个图像对象。

更新产品模型工作正常,但在更新 ProductImage 对象时它不起作用。

除了压缩,还有其他方法可以一次更新多个图像对象吗?

编辑:如果我解压缩图像列表,则更新无法正常工作。例如,如果我更改一个对象的图像,则另一个对象的图像也会更改。 但是当我更改所有图像对象图像时,更新工作正常。当我只更改某些对象时,它无法正常工作。

当我压缩然后图像列表时,这是错误回溯。

Traceback (most recent call last):
  File "venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "venv\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "\venv\lib\site-packages\django\views\generic\base.py", line 73, in view
    return self.dispatch(request, *args, **kwargs)
  File "\venv\lib\site-packages\django\views\generic\base.py", line 101, in dispatch
    return handler(request, *args, **kwargs)
  File "dashboard\product\views\views.py", line 293, in post
    p.save()
  File "venv\lib\site-packages\django\db\models\base.py", line 751, in save
    force_update=force_update, update_fields=update_fields)
  File "venv\lib\site-packages\django\db\models\base.py", line …
Run Code Online (Sandbox Code Playgroud)

python django django-views

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

提交后如何关闭Bootstrap模式?

这里我有一个 Bootstrap 模式。我的要求是当我使用提交按钮成功提交表单时,我想在几秒钟后关闭模式。这里的问题是,当我在输入中输入一些文本而不是整数时,或者如果我输入一些无效的输入,然后当我单击提交按钮时,输入字段会显示错误,并且模式会在几秒钟后立即关闭。

如果单击提交按钮时输入字段无效,我不想关闭引导模式。

我该怎么做 ?

编辑:它在有效输入的情况下完美工作。

html

 <div class="modal-body">
 <form action="">
     <input type="number" name="rows" min="0" value="0" max="10" required><br>
     <button type="submit" id="my_button" class="btn btn-info btn-sm">Submit</button>
 </form>
 </div>
Run Code Online (Sandbox Code Playgroud)

脚本

<script>
 $('#my_button').click(function() {
    setTimeout(function() {$('#myModal').modal('hide');}, 4000);
});
</script>
Run Code Online (Sandbox Code Playgroud)

html javascript jquery bootstrap-modal

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

在 django 中突出显示搜索到的文本

在这里,我正在编写自定义模板过滤器,以便突出显示匹配的搜索文本。但它无法正常工作。这里发生的情况是,它仅突出显示完全匹配的文本。例如,如果我搜索,django但如果在标题中,它是Django它忽略了Django.

我想让它不区分大小写,这样如果用户搜索django,那么DJANGO也应该突出显示。

register = template.Library()
@register.filter(name='highlight')
def highlight(text,search):
    highlighted = text.replace(search, '<b class="text text-danger">{}</b>'.format(search))
    return mark_safe(highlighted)
Run Code Online (Sandbox Code Playgroud)

视图.py

def search_blogs(request):
    q = request.GET.get('q')
    if q:
        blogs = Blog.objects.filter(title__icontains=q).order_by('-created')
        return render(request,'blog/search_blogs.html',{"blogs":blogs,'q':q})
    else:
        messages.error(request,'Please enter some keyword to search')
        return redirect('blog:blogs')
Run Code Online (Sandbox Code Playgroud)

模板

{{blog.title|highlight:q}}
Run Code Online (Sandbox Code Playgroud)

django django-templates

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

如何在 Django 模型中改变 unique true 的行为?

在这里,我没有从数据库中删除模型对象。我只是is_deleted在删除时将状态更改为 True。但是在这样做时unique=True会为已删除的对象带来错误,那么我该如何处理呢?

我想is_deleted=True从唯一的 True 中排除对象。

class MyModel(models.Model):
    name = models.CharField(max_length=20, unique=True)
    is_deleted = models.BooleanField(default=False)


#views
class MyViewSet(ModelViewSet):

    serializer_class = MySerializer
    queryset = MyModel.objects.all()

    def destroy(self, request, *args, **kwargs):
        object = self.get_object()
        object.is_deleted = True
        object.save()
        return Response(status=status.HTTP_204_NO_CONTENT)
Run Code Online (Sandbox Code Playgroud)

python django django-rest-framework

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

如何使用celery定期在django中安排我的爬虫功能?

在这里,我有一个视图CrawlerHomeView,用于从表单创建任务对象,现在我想用 celery 定期安排此任务。

我想CrawlerHomeView用任务对象 search_frequency 并通过检查一些任务对象字段来安排这个过程。

任务模型

class Task(models.Model):
    INITIAL = 0
    STARTED = 1
    COMPLETED = 2

    task_status = (
        (INITIAL, 'running'),
        (STARTED, 'running'),
        (COMPLETED, 'completed'),
        (ERROR, 'error')
    )

    FREQUENCY = (
        ('1', '1 hrs'),
        ('2', '2 hrs'),
        ('6', '6 hrs'),
        ('8', '8 hrs'),
        ('10', '10 hrs'),
    )

    name = models.CharField(max_length=255)
    scraping_end_date = models.DateField(null=True, blank=True)
    search_frequency = models.CharField(max_length=5, null=True, blank=True, choices=FREQUENCY)
    status = models.IntegerField(choices=task_status)
Run Code Online (Sandbox Code Playgroud)

任务.py

如果任务状态为 0 或 1 且未超过任务抓取结束日期,我想定期运行下面发布的视图 [期间 =(任务的搜索频率时间])。但我卡在这里了。我该怎么做?

@periodic_task(run_every=crontab(hour="task.search_frequency"))  # how …
Run Code Online (Sandbox Code Playgroud)

django django-views celery web-scraping

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

* 后的 schedule_task() 参数必须是可迭代的,而不是 int

在这里我使用的apply_async方法与countdownexpires参数一些倒计时后执行任务,并在到期日期时间的某些任务。

但我收到了这个错误

Django Version: 3.0.6 
Exception Type: TypeError
 Exception Value:    schedule_task() argument after * must be an iterable, not int
Run Code Online (Sandbox Code Playgroud)

如何解决这个错误?

任务

@periodic_task(run_every=crontab(minute=1), ignore_result=False)  
def schedule_task(pk):

    task = Task.objects.get(pk=pk)
    unique_id = str(uuid4()) 
Run Code Online (Sandbox Code Playgroud)

意见

form = CreateTaskForm(request.POST)
        if form.is_valid():

            unique_id = str(uuid4())
            obj = form.save(commit=False)           
            obj.created_by = request.user
            obj.unique_id = unique_id
            obj.status = 0
            obj.save()
            form.save_m2m()
            # schedule_task.delay(obj.pk)
            schedule_task.apply_async((obj.pk),expires=datetime.datetime.now() + datetime.timedelta(minutes=5), countdown=int(obj.search_frequency))

            return redirect('crawler:task-list')
Run Code Online (Sandbox Code Playgroud)

django django-views celery

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