Search code examples
pythondjangodjango-models

The annotation 'xy' conflicts with a field on the model - django


I have models:

class Topiccenter(models.Model):
  name = models.TextField()
  def sumentries(self):
    return self.tc_books.count() + self.tc_journals.count()

class Book(models.Model):
  name = models.TextField()
  tc = models.ForeignKey(Topiccenter,related_name="tc_books")

class Journal(models.Model):
  name = models.TextField()
  tc = models.ForeignKey(Topiccenter,related_name="tc_journals")

I am trying to do something like this:

Topiccenter.objects.annotate(tc_books=Sum('tc_books'),
                              journals=Sum('tc_journals')
                              ).extra(
                                   select={'sum_entries':'tc_books+journals'}, 
                                   order_by=('sum_entries',)
                              )

but it is saying: The annotation 'tc_books' conflicts with a field on the model.


Solution

  • The problem is that tc_books is also the related name for your books. Also, you're trying to use Sum on a non-numerical value. You should use Count instead. Try this:

    Topiccenter.objects.annotate(num_books=Count('tc_books'),
                                 num_journals=Count('tc_journals')
                                 ).extra(
                                     select={'sum_entries':'num_books+num_journals'}, 
                                     order_by=('sum_entries',)
                                 )