如何使用 Django 对此 field/relation 建模
How to model this field/relation using Django
我正在使用 django rest 框架创建一个 API 想要在我的用户模型中存储一组图片。对于每张图片,我应该有一个 URL 和布尔标志,指示它是否是显示图片。
至少应有 2 张,最多 6 张图片。这些图片中只有一张应该将 display_picture_flag 设置为 true。什么是对此建模的好方法。
我的方法(可能不是最好的)-
- 我正在考虑使用用户 class 的用户 ID 作为外键创建另一个模型 class。它将有一个 URL 字段和一个布尔字段。我对此表示怀疑,
- 我将如何验证位于 [2,6] 中的对象数量。验证只有一个标志为真。
- 同时创建 [2,6] 个对象(单个创建 API 调用)。
- 使用 JSON 字段。可能存储为字典,URL 映射到标志。
- 再次与验证混淆。
请提出更好的方法,或扩展我的方法。谢谢!
好的,所以我认为您可以在 model.save 方法中编写图片数量的验证登录。对于 display_picture_flag 字段,您可以维护一个 table,它将有两个字段 (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)
我正在使用 django rest 框架创建一个 API 想要在我的用户模型中存储一组图片。对于每张图片,我应该有一个 URL 和布尔标志,指示它是否是显示图片。 至少应有 2 张,最多 6 张图片。这些图片中只有一张应该将 display_picture_flag 设置为 true。什么是对此建模的好方法。
我的方法(可能不是最好的)-
- 我正在考虑使用用户 class 的用户 ID 作为外键创建另一个模型 class。它将有一个 URL 字段和一个布尔字段。我对此表示怀疑,
- 我将如何验证位于 [2,6] 中的对象数量。验证只有一个标志为真。
- 同时创建 [2,6] 个对象(单个创建 API 调用)。
- 使用 JSON 字段。可能存储为字典,URL 映射到标志。
- 再次与验证混淆。
请提出更好的方法,或扩展我的方法。谢谢!
好的,所以我认为您可以在 model.save 方法中编写图片数量的验证登录。对于 display_picture_flag 字段,您可以维护一个 table,它将有两个字段 (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)