Как скопировать данные из старой колонки в новую с использованием только уникальных значений?
Я пытаюсь создать новое уникальное поле под названием 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()