django中get_or_create()的使用
时间: 2023-06-01 09:06:21 浏览: 539
get_or_create() 是 Django ORM 提供的一个方法,用于查询指定的记录是否存在,如果存在则返回该记录,如果不存在则新建并返回。示例如下:
```python
from myapp.models import MyModel
obj, created = MyModel.objects.get_or_create(defaults={'name': 'test'})
```
其中,第一个返回值 `obj` 是查询或新建出来的记录对象,第二个返回值 `created` 则表示该记录是否为新创建的。如果该记录已存在,则 `created` 为 False,否则为 True。
注意,在使用 get_or_create() 方法时,需要注意并发情况下的线程安全问题。如果同时有多个线程对同一个记录进行查询或新建操作,可能会出现竞争条件并导致数据错误。这时可以使用 `select_for_update()` 方法对记录加锁,保证并发安全性。
相关问题
使用django_celery_beat实现可前端添加定时任务
使用`django_celery_beat`可以很方便地实现在前端添加定时任务。
首先需要在`settings.py`中配置`django_celery_beat`的数据库信息:
```python
INSTALLED_APPS = [
# ...
'django_celery_beat',
# ...
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler'
```
在`urls.py`中配置任务添加和删除的路由:
```python
from django.urls import path
from . import views
urlpatterns = [
path('add_task/', views.add_task, name='add_task'),
path('delete_task/<int:task_id>/', views.delete_task, name='delete_task'),
]
```
然后在`views.py`中实现添加和删除任务的方法:
```python
from django.shortcuts import render, redirect
from django.urls import reverse
from django.utils.timezone import localtime
from django_celery_beat.models import PeriodicTask, CrontabSchedule
from datetime import datetime, timedelta
def add_task(request):
if request.method == 'POST':
task_name = request.POST.get('task_name')
task_url = request.POST.get('task_url')
task_time = request.POST.get('task_time')
task_args = request.POST.get('task_args')
task_kwargs = request.POST.get('task_kwargs')
task_enabled = True if request.POST.get('task_enabled') == 'on' else False
crontab, created = CrontabSchedule.objects.get_or_create(
minute=task_time.split(':')[1],
hour=task_time.split(':')[0],
day_of_week='*',
day_of_month='*',
month_of_year='*'
)
periodic_task = PeriodicTask.objects.create(
name=task_name,
task='tasks.run_task',
args=task_args,
kwargs=task_kwargs,
crontab=crontab,
enabled=task_enabled
)
return redirect(reverse('task_list'))
return render(request, 'add_task.html')
def delete_task(request, task_id):
task = PeriodicTask.objects.get(id=task_id)
task.delete()
return redirect(reverse('task_list'))
```
在`add_task.html`模板中添加表单用于添加任务:
```html
<form method="post" action="{% url 'add_task' %}">
{% csrf_token %}
<div class="form-group">
<label for="task_name">Task Name:</label>
<input type="text" class="form-control" id="task_name" name="task_name" required>
</div>
<div class="form-group">
<label for="task_url">Task URL:</label>
<input type="text" class="form-control" id="task_url" name="task_url" required>
</div>
<div class="form-group">
<label for="task_time">Task Time:</label>
<input type="time" class="form-control" id="task_time" name="task_time" required>
</div>
<div class="form-group">
<label for="task_args">Task Args:</label>
<input type="text" class="form-control" id="task_args" name="task_args">
</div>
<div class="form-group">
<label for="task_kwargs">Task Kwargs:</label>
<input type="text" class="form-control" id="task_kwargs" name="task_kwargs">
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="task_enabled" name="task_enabled" checked>
<label class="form-check-label" for="task_enabled">Enabled</label>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
```
最后在`templates`目录下创建`task_list.html`模板用于展示所有定时任务:
```html
{% extends 'base.html' %}
{% block content %}
<h1>Task List</h1>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Name</th>
<th scope="col">Task</th>
<th scope="col">Args</th>
<th scope="col">KWArgs</th>
<th scope="col">Time</th>
<th scope="col">Enabled</th>
<th scope="col">Action</th>
</tr>
</thead>
<tbody>
{% for task in tasks %}
<tr>
<th scope="row">{{ task.id }}</th>
<td>{{ task.name }}</td>
<td>{{ task.task }}</td>
<td>{{ task.args }}</td>
<td>{{ task.kwargs }}</td>
<td>{{ task.crontab.minute }}:{{ task.crontab.hour }}</td>
<td>{% if task.enabled %}Yes{% else %}No{% endif %}</td>
<td>
<a href="{% url 'delete_task' task.id %}" class="btn btn-danger">Delete</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
```
在`tasks.py`中实现定时任务的具体操作:
```python
from celery import shared_task
@shared_task
def run_task(url, args=None, kwargs=None):
# do something
pass
```
最后在`views.py`中实现展示所有定时任务的方法:
```python
from django.shortcuts import render
from django_celery_beat.models import PeriodicTask
def task_list(request):
tasks = PeriodicTask.objects.all()
context = {
'tasks': tasks
}
return render(request, 'task_list.html', context)
```
这样就可以在前端添加定时任务了。
for codename, name in PERMISSIONS: permission, created = Permission.objects.get_or_create(codename=codename, name=name) if created: print(f'Created permission {permission}')
这是一段 Python 代码,它使用 Django 模型中的 Permission 对象创建权限。首先,它遍历一个包含权限代码和名称的元组列表 PERMISSIONS。然后,对于每个元组,它使用 get_or_create() 方法查找具有给定codename和name的Permission对象。如果对象不存在,则会创建一个新的Permission对象,并将其存储在permission变量中。最后,如果新的Permission对象被创建,它会打印一条消息来指示成功创建了该权限。
阅读全文