Как скопировать данные из старой колонки в новую с использованием только уникальных значений?

Я пытаюсь создать новое уникальное поле под названием last_name_unique. Мне нужно скопировать данные из last_name в last_name_unique. Новое поле может быть nullable, поэтому мы можем добавить null для повторяющихся значений.

Например, если есть две фамилии со значением "Junior", то под last_name_unique будет одно значение "Junior" и затем null для другого значения "Junior".

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

Любая идея, как этого добиться, будет оценена по достоинству.

Установите значение по умолчанию last_name_unique равным null

last_name_unique = models.CharField(max_length=30,default=None) 

и после этого вы можете запустить код, подобный этому:

q=mymodel.objects.all()
for e in q:
    if not len(q.filter(last_name=e.last_name))>=2:
                e.last_name_unique=e.last_name
                e.save()

Вышеприведенный код скопирует все уникальные фамилии, теперь вам не сказали, какой объект должен сохранить 'junior' как unique_last_name (т.е. последний сохраненный или другой), если есть 2 или более полей с фамилией 'junior'.

Как я знаю на данный момент, хорошим подходом было бы реализовать сигналы:

your_app/models.py

class Person(models.Model):
    ...
    last_name_unique = models.CharField(max_length=30, default=None, null=True)

your_app/apps.py

from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'  # if your Django version uses it
    name = 'your_app'

    def ready(self):
        import your_app.signals

your_app/signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
from your_app.models import Person


@receiver(post_save, sender=Person)
def add_last_name_unique(sender, instance, created, **kwargs):
    if created:
        if not Person.objects.filter(last_name=instance.last_name):
            instance.last_name_unique = instance.last_name
            instance.save()
Вернуться на верх