5

A write simple application in Django 1.7. Is a model that represents the element of a linked list:

class TrainingUserWordSetItem(models.Model):
    training_set = models.ForeignKey(TrainingUserWordSet)
    user_word = models.ForeignKey(UserWord)
    prev_item = models.ForeignKey("TrainingUserWordSetItem", null=True, default=None)
    next_item = models.ForeignKey("TrainingUserWordSetItem", null=True, default=None)

When migrating I get an error:

hellodict.TrainingUserWordSetItem.next_item: (fields.E304) Reverse accessor for 'TrainingUserWordSetItem.next_item' clashes with reverse accessor for 'TrainingUserWordSetItem.prev_item'.
        HINT: Add or change a related_name argument to the definition for 'TrainingUserWordSetItem.next_item' or 'TrainingUserWordSetItem.prev_item'.
hellodict.TrainingUserWordSetItem.prev_item: (fields.E304) Reverse accessor for 'TrainingUserWordSetItem.prev_item' clashes with reverse accessor for 'TrainingUserWordSetItem.next_item'.
        HINT: Add or change a related_name argument to the definition for 'TrainingUserWordSetItem.prev_item' or 'TrainingUserWordSetItem.next_item'.

How make two self-referential foreign key fields?

Update:

Helped use related_name='+':

class TrainingUserWordSetItem(models.Model):
    training_set = models.ForeignKey(TrainingUserWordSet)
    user_word = models.ForeignKey(UserWord)
    prev_item = models.ForeignKey("TrainingUserWordSetItem", null=True, default=None)
    next_item = models.ForeignKey("TrainingUserWordSetItem", null=True, default=None, related_name='+')
Stan Zeez
  • 1,138
  • 2
  • 16
  • 38
  • 1
    I don't think it had been a good idea to close this question, the "duplicate" is a crap (and has few to do to this problem). – peterh Sep 17 '15 at 21:13

1 Answers1

8

You could actually probably accomplish what you're attempting with one field. I believe this would work:

next_item = models.ForeignKey('self', null=True, default=None, related_name='prev_item')

Note the use of 'self'; according to the Django documentation, To create a recursive relationship – an object that has a many-to-one relationship with itself – use models.ForeignKey('self').

Additionally, I would recommend trying this with a OneToOneField, rather than a ForeignKey, assuming that every item will only ever have one previous and one next item.

Joey Wilhelm
  • 5,729
  • 1
  • 28
  • 42