В Django создайте метод модели, который определяет идентификатор для всех объектов, имеющих один и тот же внешний ключ

Я новичок в Django и при попытке создать свой первый собственный проект, я наткнулся на проблему. У меня есть два разных класса моделей: Star и Planet. У каждой планеты есть foreignkey, который принадлежит звезде. Теперь я хочу иметь поле для Planet, которое в основном является id/pk для ее звездной системы, который дается при создании/открытии. Все известные планеты звездной системы уже имеют свой id звездной системы, и поэтому вновь созданной/открытой планете потребуется id, который увеличивается от последнего присвоенного id.

Id Star Id in Star System Name
1 Sun 1 Neptune
2 Alpha Centauri 1 Hoth
3 Alpha Centauri 2 Coruscant
4 Sun 2 Earth
5 Sun 3 Jupiter
6 Alpha Centauri 3 Yavin4
7 Sun 4 Venus

Мои модели выглядят следующим образом

models.py:

class Star(models.Model):
   name = models.CharField(max_length=200)

class Planet(models.Model):
   name = models.CharField(max_length=200)
   star = models.ForeignKey(Star, on_delete=models.CASCADE)

   def starSystemPlanetId(self):
      What could work in here?

Этот новый Id должен быть доступен для вызова в шаблоне следующим образом:

{% for planets in object_list %}
    <li> 
         <p>Planet {{planets.name}} is the Nr. {{planets.customer_id}} planet of the star system</p>
    </li>
{% endfor %}

Я уже узнал, что бизнес-логика должна быть реализована внутри models.py через метод модели.

def starSystemPlanetId(self, star_var):
   starSystemPlanetId = Planet.objects.filter(star = star_var).filter(pk >> earlierPlanetsPk).count()
   return starSystemPlanetId

Возможно, уже существует стандартная функция запроса для такого рода проблем.

Любая помощь и мысли по этому поводу очень приветствуются!

Вот мое предложение (после комментариев к вашему посту):

class Planet(models.Model):
    name = models.CharField(max_length=200)
    star = models.ForeignKey(Star, on_delete=models.CASCADE, related_name='planets')

    # Use property since it's more pythonic
    @property
    def star_system_planet_id(self):
       """0-based display identifier for a planet in the start system."""
        # No need for the 'star_var' variable since you already have it in the 
        # model instance
        return self.star.planets.filter(pk__lt=self.pk).count()

Небольшое замечание: свойство не будет работать для объектов, которые не были сохранены в БД, потому что им еще не присвоен PK. Для этого вы, вероятно, захотите возвращать пустую строку или None и т.д. На ваше усмотрение.

Вернуться на верх