Проверка достоверности данных в наборе запросов
У меня есть случай, когда мне нужно объединить записи в одну. В основном фронтенд предоставляет кучу идентификаторов, Django извлекает записи, проверяет данные и создает новую запись в базе данных. Теоретически, большинство полей должны содержать одинаковые значения, кроме одного поля (мы копируем значение из всех записей в новую запись). Перед созданием новой записи я хотел бы добавить валидатор, чтобы убедиться, что значения равны. Как лучше всего выполнить сравнение? Мой мыслительный процесс выглядит следующим образом:
Получить все записи для заданных идентификаторов.
Используйте первую запись как источник истины (все остальное будет сравниваться с этой записью).
Сравните значения (вот где я застреваю).
Создайте новую запись.
Также, если у вас есть идеи, как избежать попадания в базу данных каждый раз, когда мне нужно сравнить значение, было бы здорово, эта конкретная модель имеет много полей, и я чувствую, что попадание в базу данных для каждого сравнения не очень эффективно.
Я добавил фиктивную модель, чтобы дать лучшее представление о том, чего я пытаюсь достичь:
class Book(models.Model):
name = models.CharField()
author = models.CharField()
year_published = models.DateField()
field_to_be_merged = ArrayField(
ArrayField(
models.CharField(max_length=10, blank=True),
size=8,
),
size=8,
)
name
, author
, year_published
должны быть одинаковыми (мне нужно убедиться, что они одинаковые). field_to_be_merged
содержит разные значения, и новая запись будет отображать все объединенные значения.
мы копируем значение из всех записей в новую запись" Вы можете объяснить подробнее? Зачем вам добавлять все предыдущие записи в новую? Что именно будет содержать новая запись? Можете привести пример-end-result, чтобы мы могли лучше понять, что вы хотите?
почему бы не перечислить существующие "имя" "автор" и "год_опубликования" пользователю с помощью HTML select-опций? Если в таблице есть 100 "Sol" в качестве имени, пользователь увидит одно Sol. Таким образом, он/она может видеть предыдущие записи и только вводить новое имя.
Несмотря на то, что у меня очень много вопросов по вашему вопросу, я думаю, что то, что вы описываете, может быть достигнуто в классе models с помощью queryset от django. Вы можете написать фильтр django queryset и получить все строки, которые соответствуют вашему выбору, а затем сделать то, что вам нужно.
Например:
class Book(models.Model):
name = models.CharField()
author = models.CharField()
year_published = models.DateField()
field_to_be_merged = ArrayField(
ArrayField(
models.CharField(max_length=10, blank=True),size=8,),
size=8,)
def save(self, *args, **kwargs):
db_query_set = TableName.objects.filter("name"="Sol").values_list("author", "year_published")
# db_query_set will contain "author" and "year_published" values where "name" column matches value of "Sol".
# Now you can manipulate the queryset data as you want and create final values that you want to save.
# For example, at the end, it could look like this:
self.name = new_name
self.author = new_author
self.year_published = new_year_published
self.field_to_be_merged = new_field_to_be_merged
super(Book, self).save(*args, **kwargs)
функция save() будет запускаться каждый раз, когда модель Book будет вызываться формой, и будет выполнять манипуляции для каждой записи.