Проверка достоверности данных в наборе запросов

У меня есть случай, когда мне нужно объединить записи в одну. В основном фронтенд предоставляет кучу идентификаторов, Django извлекает записи, проверяет данные и создает новую запись в базе данных. Теоретически, большинство полей должны содержать одинаковые значения, кроме одного поля (мы копируем значение из всех записей в новую запись). Перед созданием новой записи я хотел бы добавить валидатор, чтобы убедиться, что значения равны. Как лучше всего выполнить сравнение? Мой мыслительный процесс выглядит следующим образом:

  1. Получить все записи для заданных идентификаторов.

  2. Используйте первую запись как источник истины (все остальное будет сравниваться с этой записью).

  3. Сравните значения (вот где я застреваю).

  4. Создайте новую запись.

Также, если у вас есть идеи, как избежать попадания в базу данных каждый раз, когда мне нужно сравнить значение, было бы здорово, эта конкретная модель имеет много полей, и я чувствую, что попадание в базу данных для каждого сравнения не очень эффективно.

Я добавил фиктивную модель, чтобы дать лучшее представление о том, чего я пытаюсь достичь:

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 содержит разные значения, и новая запись будет отображать все объединенные значения.

  1. мы копируем значение из всех записей в новую запись" Вы можете объяснить подробнее? Зачем вам добавлять все предыдущие записи в новую? Что именно будет содержать новая запись? Можете привести пример-end-result, чтобы мы могли лучше понять, что вы хотите?

  2. почему бы не перечислить существующие "имя" "автор" и "год_опубликования" пользователю с помощью HTML select-опций? Если в таблице есть 100 "Sol" в качестве имени, пользователь увидит одно Sol. Таким образом, он/она может видеть предыдущие записи и только вводить новое имя.

  3. Несмотря на то, что у меня очень много вопросов по вашему вопросу, я думаю, что то, что вы описываете, может быть достигнуто в классе 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 будет вызываться формой, и будет выполнять манипуляции для каждой записи.

Вернуться на верх