Условный update_or_create с django - PullRequest
0 голосов
/ 01 мая 2018

Тестовая модель

class Room(models.Model):
    """
    This stores details of rooms available
    """
    name = models.CharField(
        null=False,
        blank=False,
        max_length=100,
        help_text='Enter the name of the room'
    )
    capacity = models.PositiveIntegerField(
        null=False,
        blank=False,
        help_text='Enter the number of person\'s the room can accommodate'
    )
    created_at = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now=True)

Я хочу обновить модель, если она существует, и ее время updated_at меньше, чем, скажем, время x, в противном случае просто создайте модель. Для справки вот это сырой sql, я хочу, чтобы django выполнил.

INSERT INTO room VALUES (1,'2018-04-30 18:15:32.96468+04:30','2018-04-30 18:15:32.96468+04:30','Room-A',30) ON CONFLICT(id) DO UPDATE SET capacity=10 WHERE room.modified_at < '2017-04-30 18:15:32.96468+04:30';

Также мне хотелось бы знать, является ли написанный мной SQL-запрос атомарным или нет

1 Ответ

0 голосов
/ 01 мая 2018

Следующие примеры могут работать правильно

1-й вариант

try:
    obj = Room.objects.get(
        id=id, # test with other fields if you want
    )
    if obj.modified_at < DATETIME:
        obj.capacity = 10
        obj.save()
    else:
        obj = Room.objects.create(
            # fields attributes
        )
except Room.DoesNotExist:
    obj = Room.objects.create(
        # fields attributes
    )

2-й вариант

или вы можете сделать это с помощью Условное выражение из django

from django.db.models import F, Case, When
import datetime

your_date = datetime.datetime.now()
condition = Case(When(modified_at__lt=your_date,then=10),default=F('capacity'))
  • Мы проверяем, является ли modified_at меньше your_date
  • тогда значение этого условия равно 10,
  • иначе мы сохраняем то же значение поля с F('capacity')

остаток кода

Room.objects.update_or_create(name='new_name',
           defaults={'name':'new_name','capacity':conditition})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...