2017-10-08 1 views
0

Le problème: J'ai deux modèles django:modèle Django filtre clé étrangère

class Driver(models.Model): 
    event = models.ForeignKey('Event') 
    last_event = ???? 
    ... 
    ... 

class Event(models.Model): 
    date = models.IntegerField() 

Maintenant je dois seulement dernier événement pour chaque préchargées du conducteur et mises en cache

d = Driver.objects.prefetch_related('last_event???') 

Comment puis-je réaliser? Est-il possible de limiter relation comme quelque chose comme:

last_event = models.ForeaignKey('Event', filter = ...???) 
+0

Un pilote ne peut avoir qu'un seul événement avec un ForeignKey. Donc, ce que vous recherchez est dans 'event'. Ou vous pourriez avoir besoin d'une relation de plusieurs à plusieurs. –

Répondre

0
bien

je l'ai résolu un problème en ajoutant:

def get_current_tour(self): 
     ret = None 
     self._my_relations.create_dict_path('current_tour') 
     if not self._my_relations['current_tour']: 
      try: 
      self._my_relations['current_tour'] = \ 
       DriverTour.objects.filter(start_date__lte=int(time.time()), end_date__gte=int(time.time()), driver=self.id).order_by('-id').all()[0] 
      ret = self._my_relations['current_tour'] 
     except Exception: 
      self._my_relations['current_tour'] = None 
      ret = None 
     else: 
      ret = self._my_relations['current_tour'] 
     return ret 

    def set_current_tour(self, args): 
     self._my_relations['current_tour'] = args[0] 

    current_tour = property(fget=get_current_tour, fset=set_current_tour) 

maintenant il se comporte comme prévu i: comme une propriété cacheable

0

Pour éviter de faire des dépendances de cercle, vous pouvez définir toute la clé étrangère du conducteur dans le modèle de l'événement, et aussi en raison d'un conducteur pourrait avoir de nombreuses événements.

class Event(models.Model): 
    driver = models.ForeignKey(Driver, related_name='events') 
    date = models.IntegerField() 
    created_at = models.DateTimeField(auto_now_add=True) 
    objects = EventManager() 

puis définir une propriété last_event dans le gestionnaire d'événements, comme ceci:

class EventManager(models.Manager): 
    @property 
    def last_event(self, driver): 
     return self.filter(driver=driver).lastest('created_at') 

Ensuite, vous pouvez l'appeler par Event.objects.last_event (pilote)

Si vous souhaitez utiliser driver.last_event, vous pouvez définir une propriété last_event dans le modèle de pilote:

class Driver(models.Model): 
    ... 
    @propery 
    def last_event(self): 
     the_last_event = Event.objects.last_event(self) 
     return the_last_event 
+0

pas exactement ce que je voulais dire il devrait être 'd.last_event ..... blablabla' –