Django не может создать запись с правильным внешним ключом для CharField с пробелами посередине - она будет заключена в одинарные и двойные кавычки типа "'a a'".
Прежде всего, я понимаю, что CharField - это довольно плохой первичный ключ, но это уникальное игровое имя, good 2 использует его как есть во многих местах и может содержать пробелы. И, ИМХО, проблема все равно повторится с полем, отличным от pkey
3 модели - источник и две ссылки. Первая ссылка отлично работает в пользовательском интерфейсе администратора с тем же кодом, вторая - не работает при создании записи
class PilotUsers(AbstractUser, PermissionsMixin):
first_name = None
last_name = None
username = None
ed_name = models.CharField(primary_key=True,max_length=60,null=False,blank=False,unique=True,verbose_name='Pilot name in Elite Dangerous', )
squadron_tag = models.ForeignKey('Squadrons', verbose_name='Frontier squadron tag', on_delete=models.PROTECT, default='----')
email = models.EmailField(unique=True)
USERNAME_FIELD = 'ed_name'
REQUIRED_FIELDS = ['email']
objects = PilotUserManager()
def __str__(self):
return self.ed_name
class Meta:
app_label = 'common_pages'
Это работает в пользовательском интерфейсе администратора - изображение ниже
class Cert(DetailsModel, AbstractCert):
organizational_unit_name = models.ForeignKey('common_pages.PilotUsers', verbose_name='ED Pilot Name', on_delete=models.PROTECT)
class Meta(AbstractCert.Meta):
abstract = False
swappable = swapper.swappable_setting("posts", "Cert")
Это
class ActionFeed(models.Model):
pkey = models.BigAutoField(primary_key=True)
received = models.DateTimeField(verbose_name='Date-time')
ed_name = models.ForeignKey('common_pages.PilotUsers', verbose_name='ED Pilot Name', on_delete=models.CASCADE)
#skipped
raw_data = models.JSONField(verbose_name='Raw Data', null=False)
не работает при создании новой записи
print (f'Pilot = {pilot}')
record = ActionFeed(received= ts, ed_name=pilot, #skipped
raw_data = entry)
Ошибка
Не удается назначить "'Al L****]': "ActionFeed.ed_name" должен быть экземпляром "PilotUsers".
Обратите внимание - Одиночные и двойные кавычки с каждой стороны имени - отладка печатается вообще без кавычек
Пользователь создан командой createsuperuser и точно действителен - вход на страницу администратора в порядке. Сравнил имена из Postgre, введенные amd, с моделью побайтно, используя шестнадцатеричное преобразование ASCII 2 в регистре (конечно, без кавычек) - точно. Нужно было что-то сделать для корректного сравнения данных с пробелами, но не было ни разума, ни каких-либо рекомендаций.
ed_name не может быть присвоено значение str или, по крайней мере, не напрямую. Вы можете сначала получить объект PilotUsers, а затем назначить его, например:
print(f'Pilot = {pilot}')
pilot_instance = get_object_or_404(PilotUsers, ed_name=pilot)
record = ActionFeed(received=ts, ed_name=pilot_instance, raw_data=entry)
или вы можете назначить его через базовый ed_name_id здесь, поскольку это первичный ключ:
print(f'Pilot = {pilot}')
record = ActionFeed(received=ts, ed_name_id=pilot_instance, raw_data=entry)
Следовательно, также не имеет особого смысла называть поле ed_name: это не ed_name, а PilotUsers объект.
Примечание: Обычно модели Django присваивается единственное число имя [django-антипаттерны], поэтому
PilotUserвместо.PilotUsers
