Django cannot create record with correct foreign key to CharField with spaces in middle - getting surrounded by single and double quotes like "'a a'"
First of all - I understand that CharField is rather bad primary key, but it's unique in-game name, good 2 use as-is in many places, and may contain spacees. And IMHO the problem will repeat with non pkey field anyway
3 models - source, and two references. The first reference works perfectly in admin UI with the same code, the second - unworkanle during creating record
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'
This is working in admin UI - image below
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")
This
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)
is unworkable during creating new record
print (f'Pilot = {pilot}')
record = ActionFeed(received= ts, ed_name=pilot, #skipped
raw_data = entry)
The error is
Cannot assign "'Al L****]'": "ActionFeed.ed_name" must be a "PilotUsers" instance.
Attn - Single and double quote from each side of the name - debug printed w\o quotes at all
User is created by createsuperuser command and exactly valid - admin page login is OK. Compared names from Postgre amd input to the model byte by byte using ASCII 2 Hex conversion in case (of course w\o quotes) - exact. Something needed to be done for comparing data with spaces correctly, but no mind, what - plase, advice.
ed_name
can not be assigned a str
ing, or at least not directly. You can first fetch the PilotUsers
object, and then assign it, like:
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)
or you can assign it through the underlying ed_name_id
here, since it is a primary key:
print(f'Pilot = {pilot}')
record = ActionFeed(received=ts, ed_name_id=pilot_instance, raw_data=entry)
Therefore it also does not make much sense to name the field ed_name
: it isn't an ed_name
, but a PilotUsers
object.
Note: Normally a Django model is given a singular name [django-antipatterns], so
PilotUser
instead of.PilotUsers