aiuto con model per un sistema di punteggi basato su classifiche

19 views
Skip to first unread message

marcantonio sofia

unread,
Jul 6, 2018, 11:27:52 AM7/6/18
to djan...@googlegroups.com
ciao ragazzi vi illustro il mio problema: ho un 200 player che ogni giorno si sfideranno in una gara, i primi 10 classificati prenderanno un punteggio in base alla loro posizione mentre gli altri ne prenderanno 0.
avevo pensato di strutturare i model in questo modo:

class Leaderboard(models.Model)
     
...

class DailyMatch(models.Model):
     leaderboard
=models.ForeignKey(Leaderboard)

class Player(models.Model):
    match
=models.ForeignKey(DailyMatch)
    points
=models.IntegerField()


ora i miei dubbi sono 2:
1) come strutturare il model Leaderboard per poter creare un form e quindi il relativo template in cui si dovrà inserire SOLO il nome del Player nella relativa posizione
2) come definire un metodo per aggiornare in automatico il punteggio totale del player (la somma di tutti i punteggi ottenuti nei vari match)

Karim

unread,
Jul 7, 2018, 6:41:56 PM7/7/18
to Django Italia
On Sat, Jul 7, 2018 at 1:27 AM marcantonio sofia <mrc.s...@gmail.com> wrote:
ciao ragazzi vi illustro il mio problema: ho un 200 player che ogni giorno si sfideranno in una gara, i primi 10 classificati prenderanno un punteggio in base alla loro posizione mentre gli altri ne prenderanno 0.
avevo pensato di strutturare i model in questo modo:

class Leaderboard(models.Model)
     
...

class DailyMatch(models.Model):
     leaderboard
=models.ForeignKey(Leaderboard)

class Player(models.Model):
    match
=models.ForeignKey(DailyMatch)
    points
=models.IntegerField()


ora i miei dubbi sono 2:
1) come strutturare il model Leaderboard per poter creare un form e quindi il relativo template in cui si dovesse inserire SOLO il nome del Player nella relativa posizione
​Non strutturi il model in base al form, ma il form in base ai requirements. Il form e' un form. Prende dei dati dell'utente e te li mette a disposizione convalidati. Nell'init della tua form puoi decidere cosa mostrare all'utente.​
2) come definire un metodo per aggiornare in automatico il punteggio totale del player (la somma di tutti i punteggi ottenuti nei vari match)
​Il punteggio dei player viene aggiornato dopo uno specifico evento, giusto? Ad esempio il `DailiyMatch` passa da uno stato `IN_PROGESS" a `ENDED`, a quel punto un signal avvertira' del cambiamento dello stato di DailiyMatch e il modello player aggiornera' il suo player se e' presente nel `DailyMatch` (tramite la relazione `match`)​

​Ciao​

 
--
Karim N. Gorjux

marcantonio sofia

unread,
Jul 9, 2018, 10:04:50 AM7/9/18
to Django-it
Grazie!!
In base alla tua risposta e cercando in rete ho strutturato i miei models cosi:
class Team(models.Model):

    id_team = models.IntegerField(default = 0,blank= True, primary_key=True)
   name = models.CharField(max_length = 256)
   code = models.CharField(max_length = 10)
   nation = models.ForeignKey(Nation,related_name='nation', on_delete=models.CASCADE)
   continent = models.CharField(max_length = 10)
   category = models.CharField(max_length = 256)

    def __str__(self):
       return self.name

class Nation(models.Model):
   id_nation = models.IntegerField(default = 0,blank= True,primary_key=True)
   name = models.CharField(max_length = 256)
   code_name = models.CharField(max_length = 256)

    def __str__(self):
       return self.name
#-----------------------------------------------------#

class Rider(models.Model):
   id_raider = models.IntegerField(default = 0,blank= True, primary_key=True)
   first_name = models.CharField(max_length = 256,blank= True)
   last_name = models.CharField(max_length = 256,blank= True)
   display_name = models.CharField(max_length = 256,blank= True)
   birth = models.DateTimeField(default=timezone.now)
   place_of_birth = models.CharField(max_length = 256,blank= True)
   age = models.IntegerField(default = 0,blank= True)
   nationality = models.ForeignKey(Nation,related_name='nation', on_delete=models.CASCADE)
   height = models.FloatField(default = 0.0 ,blank= True)
   weight = models.FloatField(default = 0.0 ,blank= True)
   team = models.ForeignKey(Team,related_name='team', on_delete=models.CASCADE)
   cost = models.IntegerField(default = 0,blank= True)
   stage = models.ForeignKey(Stage,related_name='stage', on_delete=models.CASCADE)
   

    def __str__(self):
       return self.display_name

   
class Stage(models.Model):
   id_stage = models.IntegerField(default = 0,blank= True, primary_key=True)
   date = models.DateTimeField(default=timezone.now)
   tipo = models.CharField(max_length = 256,blank= True)
   start = models.CharField(max_length = 256,blank= True)
   end = models.CharField(max_length = 256,blank= True)
   km = models.CharField(max_length = 256,blank= True)
   profile = models.CharField(max_length = 256,blank= True)
   hc = models.IntegerField(default = 0,blank= True)
   UNOc = models.IntegerField(default = 0,blank= True)

    def __str__(self):
       return self.date

class Risultato(models.Model):
   id_raider = models.ForeignKey(Raider,related_name='raider', on_delete=models.CASCADE)
   id_stage = models.ForeignKey(Stage,related_name='team', on_delete=models.CASCADE)
   type_ris = models.CharField(max_length = 256,blank= True)
   rank = models.IntegerField(default = 0,blank= True)
   punti = models.IntegerField(default = 0,blank= True)

    def __str__(self):
       return self.id_raider,self.id_stage,self.rank

pero ho ancora dei dubbi su come strutturare il template. La richiesta che mi è stata fatta , come spiegavo in precedenza , è di avere questa pagina in cui si dovranno compilare manualmente 3 classifiche diverse: la prima con 10 posizioni (il primo prenderà 100 punti il secondo 90 e cosi via fino al 10 tutti gli altri 0) la seconda con 10 posizioni ma con punteggi diversi(il primo ne prenderà 25 il secondo 20 ecc) e la 3 con sei posizioni e punteggi ancora diversi. Il "type_ris" del model Risultato dovrebbe servire per gestire i punti in base al tipo di classifica. Alla fine della pagina ci sarà un unico pulsante salva per tutti i risultati. Purtroppo questa è stata una richiesta esplicita e hanno particolarmente a cuore che sia cosi.

Karim

unread,
Jul 9, 2018, 11:16:10 PM7/9/18
to Django Italia


On Tue, Jul 10, 2018 at 12:04 AM marcantonio sofia <mrc.s...@gmail.com> wrote:
pero ho ancora dei dubbi su come strutturare il template. La richiesta che mi è stata fatta , come spiegavo in precedenza , è di avere questa pagina in cui si dovranno compilare manualmente 3 classifiche diverse: la prima con 10 posizioni (il primo prenderà 100 punti il secondo 90 e cosi via fino al 10 tutti gli altri 0) la seconda con 10 posizioni ma con punteggi diversi(il primo ne prenderà 25 il secondo 20 ecc) e la 3 con sei posizioni e punteggi ancora diversi. Il "type_ris" del model Risultato dovrebbe servire per gestire i punti in base al tipo di classifica. Alla fine della pagina ci sarà un unico pulsante salva per tutti i risultati. Purtroppo questa è stata una richiesta esplicita e hanno particolarmente a cuore che sia cosi.

​Il modello e' da rivedere un poco. Ad esempio hai:

class Rider(models.Model):   
    id_raider = models.IntegerField(default = 0,blank= True, primary_key=True)

​Poi...

class Risultato(models.Model):
   id_raider = models.ForeignKey(Raider,related_name='raider', on_delete=models.CASCADE)

​Uno e' un integer e l'altro e' un FK... questo non e' bene.
Inoltre usi delle parole che io non userei mai come field name. Ad esempio `date` nel modello `Stage`

Altro errore che vedo:

   nation = models.ForeignKey(Nation,
​ ​
related_name='nation', on_delete=models.CASCADE)
​ ​

Io penso che il related_name non debba essere `nation`, ma `teams`!
​Comunque, a parte il naming, mi sa che il modello debba essere rivisto sia nei nomi che nel dominio.

marcantonio sofia

unread,
Jul 10, 2018, 11:54:00 AM7/10/18
to Django-it

​Comunque, a parte il naming, mi sa che il modello debba essere rivisto sia nei nomi che nel dominio.

mi potresti dare una mano per sistemarlo?:D
 

Karim

unread,
Jul 10, 2018, 6:18:54 PM7/10/18
to Django Italia
On Wed, Jul 11, 2018 at 1:54 AM marcantonio sofia <mrc.s...@gmail.com> wrote:

​Comunque, a parte il naming, mi sa che il modello debba essere rivisto sia nei nomi che nel dominio.

mi potresti dare una mano per sistemarlo?:D

​Se metti un repo da qualche parte si puo' fare qualcosa.​

 
--
Karim N. Gorjux
Reply all
Reply to author
Forward
0 new messages