Files
app-store-optimization/skills/loki-mode/benchmarks/results/2026-01-05-10-37-54/swebench-loki-patches/django__django-15819.patch

101 lines
5.3 KiB
Diff

# django__django-15819
# Loki Mode Multi-Agent Patch
# Attempts: 1
Based on my knowledge of Django's inspectdb command and the issue description, I can generate the patch. The inspectdb.py file generates Django models from existing database tables. The fix needs to track which related models have been used for ForeignKey/OneToOneField fields within each model and add `related_name` when there are duplicates.
Here's the patch:
```
--- a/django/core/management/commands/inspectdb.py
+++ b/django/core/management/commands/inspectdb.py
@@ -58,6 +58,8 @@ class Command(BaseCommand):
yield ''
yield ''
yield 'class %s(models.Model):' % table2model(table_name)
+ # Track used relations to detect duplicates needing related_name
+ used_relations = {}
known_models.append(table2model(table_name))
used_column_names = [] # Holds column names used in the table so far
column_to_field_name = {} # Maps column names to names of model fields
@@ -119,9 +121,18 @@ class Command(BaseCommand):
if rel_to in known_models:
field_type = '%s(%s' % (rel_type, rel_to)
else:
- field_type = "%s('%s'" % (rel_type, rel_to)
+ field_type = '%s(%r' % (rel_type, rel_to)
+
+ # Track relations to same model and add related_name if needed
+ if rel_to in used_relations:
+ extra_params['related_name'] = '%s_%s_set' % (
+ table_name.lower(), att_name
+ )
+ # Also add related_name to the first occurrence if not done
+ if used_relations[rel_to] is not None:
+ first_field, first_line_idx = used_relations[rel_to]
+ used_relations[rel_to] = None # Mark as handled
+ else:
+ used_relations[rel_to] = (att_name, len(used_column_names))
else:
# Calling `get_field_type` to get the field type string and any
# additional parameters and notes.
```
Wait, I need to reconsider this approach. The issue is that inspectdb generates field definitions line by line, so we can't easily go back and modify a previous field. Let me create a simpler, more practical patch:
```
--- a/django/core/management/commands/inspectdb.py
+++ b/django/core/management/commands/inspectdb.py
@@ -58,6 +58,8 @@ class Command(BaseCommand):
yield ''
yield ''
yield 'class %s(models.Model):' % table2model(table_name)
+ # Track used relations to detect duplicates needing related_name
+ used_relations = {}
known_models.append(table2model(table_name))
used_column_names = [] # Holds column names used in the table so far
column_to_field_name = {} # Maps column names to names of model fields
@@ -121,6 +123,15 @@ class Command(BaseCommand):
field_type = '%s(%s' % (rel_type, rel_to)
else:
field_type = "%s('%s'" % (rel_type, rel_to)
+
+ # Add related_name to avoid clashes when multiple FKs
+ # reference the same model
+ if rel_to in used_relations:
+ extra_params['related_name'] = '%s' % att_name
+ else:
+ used_relations[rel_to] = att_name
+ if used_relations.get(rel_to) and used_relations[rel_to] != att_name:
+ extra_params['related_name'] = '%s' % att_name
else:
# Calling `get_field_type` to get the field type string and any
# additional parameters and notes.
```
Actually, a cleaner approach is to always add related_name when there are multiple FK fields to the same model. Let me provide the correct patch:
--- a/django/core/management/commands/inspectdb.py
+++ b/django/core/management/commands/inspectdb.py
@@ -58,6 +58,8 @@ class Command(BaseCommand):
yield ''
yield ''
yield 'class %s(models.Model):' % table2model(table_name)
+ # Track relations to detect when multiple FKs reference same model
+ used_relations = {}
known_models.append(table2model(table_name))
used_column_names = [] # Holds column names used in the table so far
column_to_field_name = {} # Maps column names to names of model fields
@@ -121,6 +123,12 @@ class Command(BaseCommand):
field_type = '%s(%s' % (rel_type, rel_to)
else:
field_type = "%s('%s'" % (rel_type, rel_to)
+
+ # Add related_name to avoid reverse accessor clashes when
+ # multiple ForeignKey fields reference the same model
+ if rel_to in used_relations:
+ extra_params['related_name'] = att_name
+ used_relations[rel_to] = att_name
else:
# Calling `get_field_type` to get the field type string and any
# additional parameters and notes.