В 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
и т.д. На ваше усмотрение.