2015-05-07 3 views
0

я две модели Set и Photo:Джанго - цикл отношений между моделями

class Set(models.Model): 
    ... 
    thumbnail = models.OneToOneField('Photo') 
    ... 

class Photo(models.Model): 
    ... 
    set = models.ForeignKey('Set', related_name='photos') 
    ... 

Проблема заключается в том, что Джанго не может обработать этот код, потому что делает модель Set требует модель Photo, которая зависит от модели Set , который пока недоступен. Каковы решения этой проблемы?

UPD: Другой способ, но я думаю, что это не очень хорошее решение.

class Set(models.Model): 
    ... 
    photos = models.ManyToManyField('Photo', related_name='set') 
    thumbnail = models.OneToOneField('Photo') 
    ... 

class Photo(models.Model): 
    ... 
    # some fields like name, size, etc.. 
    ... 
+0

Я не верю, что вам нужно это заданное поле ... что вы пытаетесь сделать? – onyeka

+0

Я предполагаю, что он хочет «наборы» (коллекции, альбомы ...) фотографий, где одна из фотографий используется как «миниатюра» (обложка, что угодно) для набора. Выглядит довольно стандартно для фотогалереи или как ... –

ответ

1

Ваша модель как-то сломана так или иначе, как это не Inforce того факта, что миниатюра для данного набора должна быть частью фотографий множества. Другим решением является отметка одной из фотографий набора в виде миниатюры:

class Set(models.Model): 
    @property 
    def thumbnail(self): 
     try: 
      return self.photos.get(is_thumbnail=True) 
     except Photo.DoesNotExist: 
      # You can either use the first photo or just return None. 
      # Note that if the set has no photos self.photos.first() 
      # will actually return None anyway 
      return self.photos.first() 


class Photo(models.Model): 
    set = models.ForeignKey(Set, related_name='photos') 
    is_thumbnail = models.BooleanField(default=False) 

    # cf https://docs.djangoproject.com/en/1.8/ref/models/instances/#validating-objects 
    def clean(self): 
     if self.is_thumbnail: 
      qs = self.set.photos.filter(is_thumbnail=True) 
      if self.pk: 
       qs = qs.exclude(pk=self.pk) 
      if qs.exists(): 
       raise ValidationError("Only one thumbnail per set") 
+0

Не будет ошибки, если я попытаюсь добавить два объекта в один набор, а is_thumbnail будет False? –

+0

@VitalyNevgen упс мой плохой ... Да, вы правы, конечно . Я должен знать лучше, уже имел этот вариант использования несколько раз. И, конечно же, решение состоит в том, чтобы вручную принудительно применять ограничение в валидации модели. –

+0

@VitalyNevgen отредактировал мой фрагмент кода;) –