Модель управления турнире


Я создаю турнир управления веб-приложение, используя трясогузка и после поиска различных решений в интернете пришел к следующему:

YEAR_CHOICES = []
for r in range(1999, (datetime.now().year+1)):
    YEAR_CHOICES.append((r,r))

class Staff(models.Model):
    """
    Each team has staff like: Coach, Assistant etc
    """
    name = models.CharField(max_length=128)
    surname = models.CharField(max_length=128)
    position = models.CharField(max_length=128, choices=POSITIONS)

    panels = [
        FieldPanel('name', classname="col6"),
        FieldPanel('surname', classname="col6"),
        FieldPanel('position'),
    ]

    def __str__(self):
        return "{} {}".format(self.name, self.surname)

class Player(models.Model):
    number = models.IntegerField(default=0)
    name = models.CharField(max_length=128)
    surname = models.CharField(max_length=128)
    position = models.CharField(max_length=128, choices=POSITIONS_SP)
    year_of_birth = models.IntegerField(choices=YEAR_CHOICES, default=datetime.now().year)

    panels = [
        FieldPanel('number'),
        FieldPanel('name', classname="col6"),
        FieldPanel('surname', classname="col6"),
        FieldPanel('position'),
        FieldPanel('year_of_birth'),
    ]

    def __str__(self):
        return "{} {}".format(self.name, self.surname)

class PlayerRelatedModel(models.Model):
    """
    Using ParentalKey allows me to add players dynamically.
    """
    player = models.ForeignKey(Player)
    in_team = models.DateField()
    page = ParentalKey('PlayerContract',
        related_name='spieler_in_team')

    panels = [
        FieldPanel('player', classname="col6"),
        FieldPanel('in_team', classname="col6")
    ]

class PlayerContract(ClusterableModel):
    player = models.ForeignKey(Player)
    team = models.ForeignKey('TeamRooster')
    in_team = models.DateField()

    panels = [
        FieldPanel('team'),
        InlinePanel(
            'player_in_team', label="Add player",
            panels=None
        )
    ]

    def __str__(self):
        return "{} in {} seit {}".format(self.player, self.team, self.jahr)

class StaffContract(models.Model):
    player = models.ForeignKey(Staff)
    team = models.ForeignKey('TeamRooster')
    in_team = models.DateField()

    panels = [
        FieldPanel('player'),
        FieldPanel('team'),
        FieldPanel('in_team'),
    ]

    def __str__(self):
        return "{} in {} seit {}".format(self.player, self.team, self.in_team)

class TeamRooster(Page):
    player = models.ManyToManyField(Player, through=PlayerContract, blank=True)
    staff = models.ManyToManyField(Staff, through=StaffContract, blank=True)

    parent_page_types = ['Teams']

    content_panels = [
        FieldPanel('title'),
        FieldPanel('staff'),
        FieldPanel('player')
    ]

    def __str__(self):
        return self.title

class Teams(Page):
    introduction = models.TextField(
        help_text='Text to describe the page',
        blank=True)

    content_panels = Page.content_panels + [
        FieldPanel('introduction', classname="full"),
    ]

    # Can only have TeamRooster children
    subpage_types = ['TeamRooster']

    # Returns a queryset of TeamRooster objects that are live, that are direct
    # descendants of this index page with most recent first
    def get_teams(self):
        return TeamRooster.objects.live().descendant_of(
            self).order_by('-first_published_at')

    # Allows child objects (e.g. TeamRooster objects) to be accessible via the
    # template. We use this on the HomePage to display child items of featured
    # content
    def children(self):
        return self.get_children().specific().live()

    def get_context(self, request):
        context = super(Teams, self).get_context(request)
        context['teams'] = TeamRooster.objects.descendant_of(
            self).live().order_by(
            '-date_published')
        return context

Добавление игроков в команду

enter image description here

У меня очень мало опыта в программировании, я буду счастлив с любыми исправлениями.

И, пожалуйста, может кто-нибудь добавить метку wagtail на этот вопрос?



152
3
задан 9 апреля 2018 в 01:04 Источник Поделиться
Комментарии
1 ответ

Вот несколько мыслей, как код может быть немного переработан.

Расчет YEAR_CHOICES немного некрасиво. Вы могли бы сделать это более элегантно с пониманием списка:

from datetime import datetime

YEARS = [(year, year) for year in range(1999, datetime.now().year+1)]

Обратите внимание, что я также изменил некоторые имена переменных. Нейминг-это очень важный навык.

Это гораздо легче понять (year, year) for year in range(...) вместо for r in range(...). Что r стенд для? Имена переменных должны иметь какой-то смысл.

У вас есть еще один постоянный POSITIONS, который не показали в своем вопросе. Вы должны быть последовательными и сохранить в той же Конвенции название всему проекту.

Вы могли суффикс все ваш выбор константы с _CHOICES, как:


  • YEAR_CHOICES

  • POSITION_CHOICES

где суффикс будет загромождать код и быть излишним, или сохранить имена лаконичны, как:


  • Лет

  • Позиции

Если у вас есть более широкий выбор констант, вы могли бы в конечном итоге положить их в свой собственный файл. Это дело вкуса и зависит от размера вашего проекта. Лично если мне придется использовать выбор чаще в моей модели, я создаю дополнительный файл choices.py или constants.py и поставить всех выбор есть. Затем вы можете импортировать их в models.py:

from . import choices

и использовать их так:

position = models.CharField(max_length=128, choices=choices.POSITIONS)

Вот у нас еще одна проблема. Почему max_length=128? Когда вы используете выбор, вы хотите сохранить короткую строку в базу данных и разрешить его в приложении. Примером может быть:

(
('FW', 'Forward'),
('LB', 'Left Back'),
('MF', 'Midfielder'),
)

Тогда вы сможете установить max_length=2 и сохранить вашу базу данных более производительным.

Далее вы смешиваете стиль кодирования в ForeignKey поля. Держите это:

team = models.ForeignKey('TeamRooster')

и изменить это:

player = models.ForeignKey(Player)

к:

player = models.ForeignKey(`Player`)

Если вы хотите обновить Джанго 2, вам придется пройти on_delete на этом поле. Сделать ваше будущее код и сделать это сейчас. Хотя это не обязательный аргумент, то высота рекомендуется указать related_name. Вот пример:

player = models.ForeignKey(`Player`, on_delete=models.CASCADE, related_name=`contracts`)

Заключите в кавычки в through аргументы в полях M2M, тоже:

player = models.ManyToManyField(Player, through=`PlayerContract`, blank=True)

Не зная вашу историю, я не могу предоставить дополнительную информацию о бизнес-логике вашего приложения.

2
ответ дан 9 мая 2018 в 08:05 Источник Поделиться