如何使用 Django 对此 field/relation 建模

How to model this field/relation using Django

我正在使用 django rest 框架创建一个 API 想要在我的用户模型中存储一组图片。对于每张图片,我应该有一个 URL 和布尔标志,指示它是否是显示图片。 至少应有 2 张,最多 6 张图片。这些图片中只有一张应该将 display_picture_flag 设置为 true。什么是对此建模的好方法。

我的方法(可能不是最好的)-

  1. 我正在考虑使用用户 class 的用户 ID 作为外键创建另一个模型 class。它将有一个 URL 字段和一个布尔字段。我对此表示怀疑,
  1. 使用 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)
       
  1. 用户
  2. display_picture_flag = True
  3. 的图片

每当你得到 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)