Как смоделировать это поле/отношение с помощью Django

Я создаю API с использованием django rest framework и хочу хранить массив картинок внутри моей модели пользователя. Для каждой картинки у меня должен быть URL и булев флаг, указывающий, является ли она отображаемой картинкой или нет. Должно быть минимум 2 и максимум 6 картинок. Одна и только одна из этих картинок должна иметь флаг display_picture_flag установленный как true. Что было бы хорошим способом смоделировать это.

Мой подход (может быть не лучшим) -

  1. I'm thinking of creating another model class with user id from user class as the foreign key. It will have an URL field and a boolean field aswell. My doubts with this are,
  • Как я проверю количество объектов, лежащих в [2,6]. Проверяю, что только один флаг является истинным.
  • Создание [2,6] объектов одновременно (один вызов API Create).
  1. Using JSON field. probably store as dictionary with URL mapped to flag.
  • Опять путаница с валидацией.

Пожалуйста, предложите лучшие подходы или расширьте мои подходы. Спасибо!

Ок, я думаю, что вы можете написать валидационный логин для количества картинок в вашем методе model.save. А для поля display_picture_flag вы можете вести таблицу, в которой будет два поля (CurrentActivePicModel).

Например:

  class PictureModel(models.Model):
       user = models.ForeignKey(User, on_delete=CASCADE)
       url_value = models.URLField()
       display_picture_flag = models.BooleanField(default=False)

  class CurrentActivePicModel(models.Model):
       user = models.ForeignKey(User, on_delete=CASCADE)
       picture = models.ForeignKey(PictureModel, on_delete=CASCADE)
       
  1. пользователь
  2. картинка, для которой display_picture_flag = True

когда вы получаете новый вход (картинку) с флагом display_picture_flag = True, вы можете проверить в CurrentActivePicModel, какая картинка установлена в True, и затем вы можете установить ее false или как угодно, а затем сохранить ее.

Опять же, вы можете проверить количество существующих картинок в вашем методе save() модели и любой существующей CurrentActivePicModel. Я могу предоставить вам код, если вы хотите.

Я думаю, это должно решить ваш вопрос

 class PictureModel(models.Model):
      user = models.ForeignKey(User, on_delete=CASCADE)
      url_value = models.URLField()
      display_picture_flag = models.BooleanField(default=False)

      # overriding default save method
      def save(self, *args, **kwargs):

          # check count of pictures for current user
          pic_cnt =  PictureModel.objects.filter(user=self.user).count()
          if pic_cnt > 7:
              return {'error':"some error line"}
          else:
              # saving picture for the current user
              saveObj = super().save(*args, **kwargs)
        
              # if this picture is to be set true then update 
              # CurrentActivePicModel to this picture
              if self.display_picture_flag:
                  print(CurrentActivePicModel)
                  active_pic_obj = 
                  CurrentActivePicModel.objects.filter(user=self.user).first()

                  # if any true picture is available for this user if none 
                  #create new entry of CurrentActivePicModel with current 
                  #picture
                  if active_pic_obj is not None:
                      active_pic_obj.picture = self
                      active_pic_obj.save()
                  else:
                      currObj = CurrentActivePicModel(user=self.user, 
                      picture=self)
                      currObj.save()
        


   class CurrentActivePicModel(models.Model):
       user = models.ForeignKey(User, on_delete=models.CASCADE)
       picture = models.ForeignKey(PictureModel, on_delete=models.CASCADE)
Вернуться на верх