Как смоделировать это поле/отношение с помощью Django
Я создаю API с использованием django rest framework и хочу хранить массив картинок внутри моей модели пользователя. Для каждой картинки у меня должен быть URL и булев флаг, указывающий, является ли она отображаемой картинкой или нет. Должно быть минимум 2 и максимум 6 картинок. Одна и только одна из этих картинок должна иметь флаг display_picture_flag установленный как true. Что было бы хорошим способом смоделировать это.
Мой подход (может быть не лучшим) -
- 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).
- 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)
- пользователь
- картинка, для которой 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)