Я нашел эту ошибку в журнале сервера. Не могу воспроизвести проблему.
File "/home/futilestudio/.venvs/36venv/lib/python3.6/site-packages/django/db/models/query.py", line 250, in __len__
self._fetch_all()
File "/home/futilestudio/.venvs/36venv/lib/python3.6/site-packages/django/db/models/query.py", line 1186, in _fetch_all
self._result_cache = list(self._iterable_class(self))
File "/home/futilestudio/.venvs/36venv/lib/python3.6/site-packages/django/db/models/query.py", line 54, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
File "/home/futilestudio/.venvs/36venv/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1065, in execute_sql
cursor.execute(sql, params)
File "/home/futilestudio/.venvs/36venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 100, in execute
return super().execute(sql, params)
File "/home/futilestudio/.venvs/36venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 68, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/home/futilestudio/.venvs/36venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/home/futilestudio/.venvs/36venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "/home/futilestudio/.venvs/36venv/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/futilestudio/.venvs/36venv/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
django.db.utils.NotSupportedError: FOR UPDATE cannot be applied to the nullable side of an outer join
Я думаю, что это происходит только на базе PostgreSQL
. Я пробовал Sqlite
раньше, и это сработало.
Проблема здесь:
match, created = Match.objects.update_or_create(
match_id=draft_match.match_id,
defaults={
field.name: getattr(
temp_match, field.name, None
) for field in Match._meta.fields if not field.name in [
'id', 'pk'
]
}
)
Есть ли проблема в атрибутах, или я не должен использовать update_or_create
и делать это по-другому?
EDIT
In [18]: match, created = Match.objects.update_or_create(match_id=draft_match.match_id, defaults={
...: field.name: getattr(temp_match, field.name, None) for field in Match._meta.fields if
...: not field.name in ['id', 'pk','created','modified','home_team','away_team']})
возвращает ту же ошибку, поэтому я проверил значения по умолчанию, и НЕТ из них ReversedForeignKey
, их всего два ForeignKey
, но когда я их исключаю, возникает такая же ошибка.
In [22]: {
...: ...: field.name: (getattr(temp_match, field.name, None),field) for field in Match._meta.fields if
...: ...: not field.name in ['id', 'pk','created','modified']}
...:
...:
Out[22]:
{'match_url': ('https://cestohlad.eu/sport-kansas-city-monterrey/',
<django.db.models.fields.URLField: match_url>),
'match_id': ('4ps3utZN', <django.db.models.fields.CharField: match_id>),
'datetime': (datetime.datetime(2019, 4, 12, 3, 0),
<django.db.models.fields.DateTimeField: datetime>),
'home_team': (<Team: Sporting Kansas City (USA) (CURGfJWt)>,
<django.db.models.fields.related.ForeignKey: home_team>),
'away_team': (<Team: Monterrey (Mex) (Ya23C2Zs)>,
<django.db.models.fields.related.ForeignKey: away_team>),
'home_score': (2,
<django.db.models.fields.PositiveSmallIntegerField: home_score>),
'away_score': (5,
<django.db.models.fields.PositiveSmallIntegerField: away_score>),
'home_odds': (Decimal('0.6215'),
<django.db.models.fields.DecimalField: home_odds>),
'away_odds': (Decimal('0.4850'),
<django.db.models.fields.DecimalField: away_odds>),
'under_odds': (Decimal('2.02'),
<django.db.models.fields.DecimalField: under_odds>),
'over_odds': (Decimal('1.84'),
<django.db.models.fields.DecimalField: over_odds>),
'total': (Decimal('2.75'), <django.db.models.fields.DecimalField: total>),
'total_real': (Decimal('7.00'),
<django.db.models.fields.DecimalField: total_real>),
'correct': (False, <django.db.models.fields.BooleanField: correct>),
'home_odds_raw': (Decimal('0.4464'),
<django.db.models.fields.DecimalField: home_odds_raw>),
'draw_odds_raw': (Decimal('0.2817'),
<django.db.models.fields.DecimalField: draw_odds_raw>),
'away_odds_raw': (Decimal('0.3484'),
<django.db.models.fields.DecimalField: away_odds_raw>)}