2010-10-17 1 views
3

После регулярной многозадачной логики запроса задает мне ошибки. Я предполагаю, что, поскольку он связан с собой, мне может понадобиться сделать дополнительную магию, но я не могу понять, какую магию.Django, queryset to return manytomany of self

модель:

class Entry(models.Model): 
    title = models.CharField(max_length=100, verbose_name='title') 
    related  = models.ManyToManyField('self', related_name='related_entries', blank=True) 

QuerySet:

entry = Entry.objects.get(pk=1) 
related = entry.related_entries.all() 

ошибка: объект 'Entry' имеет атрибута 'related_entries'

ответ

8

Посмотрите на документации для symmetrical аргумент ManyToManyField :

When Django processes this model, it identifies that it has a ManyToManyField on itself, and as a result, it doesn't add a person_set attribute to the Person class. Instead, the ManyToManyField is assumed to be symmetrical -- that is, if I am your friend, then you are my friend.

If you do not want symmetry in many-to-many relationships with self, set symmetrical to False. This will force Django to add the descriptor for the reverse relationship, allowing ManyToManyField relationships to be non-symmetrical.

Итак, для использования related_name, установите symmetrical=False.

+0

Правильно, теперь он прекратил возвращать мне ошибку. Но теперь у меня две записи. Скажите EntryA & EntryB. Когда EntryA имеет EntryB как related_entries, вызов entry.related_entries.all() ничего мне не дает. Но когда у EntryA есть как EntryB, так и EntryA (сама) как related_entries, вызов entry.related_entries.all() возвращает мне только EntryA, а не EntryB. * mindboggled * – Kasper

+1

Kasper: в этом случае вы хотите, чтобы они были симметричными: вместо этого просто удалите 'related_name' и используйте' entry.related.all() ' –

+0

Piet, спасибо! что сделал трюк – Kasper

 Смежные вопросы

  • Нет связанных вопросов^_^