2011-10-20 32 views
18

Ayrıca, genel olması gereken bire bir ilişki kurmalıyım. Bana daha iyi bir tasarım önerebilirsin. Şimdiye kadar ben tüm eylemleri toplamak istediğiniz olay listesinde aşağıdaki modellerde Django Yönetici olarakDjango'da genel bire bir ilişki

class Event(models.Model): 
    # skip event related fields... 
    content_type  = models.ForeignKey(ContentType) 
    object_id   = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

    class Meta: 
     unique_together = ('content_type', 'object_id') 

class Action1(models.Model): 
    # skip action1 related fields... 
    events = generic.GenericRelation(Event, content_type_field='content_type', object_id_field='object_id') 

    @property 
    def event(self): 
     return self.events.get() # <<<<<< Is this reasonable? 

class Action2(models.Model):... 

kadar geldi ve oradan ben eylemler için yönetici sayfalarına gidin istiyorum. Aksiyon modellerinde event özelliği yaratmamak mümkün mü? Daha iyi bir çözüm var mı? events alanını ve event özelliğini tek bir tanımda birleştirmek güzel olurdu. Çalıştığım proje Django 1.1

+0

Gerçekten de 'events''den kaçınmak istiyorsanız, aşağıdaki gibi sorguyu "Event" tablosuna manuel olarak uygulamanız gerekir. Yine de “Olayları” bir GenericRelation olarak kullanmayı tercih ediyorum ve “event” özelliğindeki 'self.events.first()' işlevini kullanıyorum. Ayrıca, bu, gelecekte benzersiz kısıtlamayı kaldırmanızı daha kolay bir şekilde sağlar. – alexcasalboni

cevap

14

Son zamanlarda came across this problem kullanıyorum. Ne yaptın iyi, ama sen şeffaf ilişkiyi tersine bir mixin oluşturarak biraz daha onu genelleme yapabiliriz:

class Event(models.Model): 
    content_type  = models.ForeignKey(ContentType) 
    object_id   = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

    class Meta: 
     unique_together = ('content_type', 'object_id') 

class EventMixin(object): 
    @property 
    def get_event(self): 
     ctype = ContentType.objects.get_for_model(self.__class__) 
     try: 
      event = Event.objects.get(content_type__pk = ctype.id, object_id=self.id) 
     except: 
      return None 
     return event 

class Action1(EventMixin, models.Model): 
    # Don't need to mess up the models fields (make sure the mixing it placed before models.Model) 
    ... 

ve

action = Action1.object.get(id=1) 
event = action.get_event 

Sen bir geri dönüşe karşı önbelleğe alma eklemek isteyebilirsiniz ilişki çok

+0

Onun iyi çalışıyor, ama bunu yapmak için yeteneği vermek değil: 'Action.objects.select_related ('event')' – ramusus

+0

Ben bu çözümü sevmiyorum -> bir 'GenericRelation' kullanmak gerekiyorsa bile, daha iyi görünüyor self.events.get() 'veya' self.events.first() ' – alexcasalboni

+0

Yukarıdaki yorumların aynısı. Başlangıçta “GenericRelation” ile yaptığınız şey çok daha iyi. –

İlgili konular