Python 使用多个“创建/更新模型”;“许多”;及;透过「;关系

Python 使用多个“创建/更新模型”;“许多”;及;透过「;关系,python,django,django-models,django-rest-framework,django-serializer,Python,Django,Django Models,Django Rest Framework,Django Serializer,我正在django Rest框架中为我的移动应用程序创建Rest API。我的应用程序类似于MyFitnessPal,所以我的用户有他们自己的饮食记录,他们的膳食在哪里,每餐都有食品列表 现在,当我注册用户时,我正在为他创建一个新的、空的食物历史 因此,下一步我想添加选项来添加/更新这些膳食。当用户希望将日期为2019年10月10日的食品添加到“早餐”中时,我想检查用户历史记录中是否已经存在日期为2019年10月10日的膳食“早餐”。如果没有,则创建它(并将“Food_date”参数设置为请求日

我正在django Rest框架中为我的移动应用程序创建Rest API。我的应用程序类似于MyFitnessPal,所以我的用户有他们自己的饮食记录,他们的膳食在哪里,每餐都有食品列表

现在,当我注册用户时,我正在为他创建一个新的、空的食物历史

因此,下一步我想添加选项来添加/更新这些膳食。当用户希望将日期为2019年10月10日的食品添加到“早餐”中时,我想检查用户历史记录中是否已经存在日期为2019年10月10日的膳食“早餐”。如果没有,则创建它(并将“Food_date”参数设置为请求日期),如果是,则使用其ID(已创建)获取食品表单DB,并使用“Food_weight”参数将其添加到用户历史记录中

我不知道如何做,当我有很多很多,通过关系。我知道我必须重写serializers.py中的“create”和“update”方法以及“api.py”中的“post”方法,但现在我甚至不确定哪个序列化程序应该作为“serializer\u类”出现在我的APIView(api.py)类中

models.py

类食品(models.Model):
name=models.CharField(最大长度=255)
brand=models.CharField(最大长度=255,默认为“”)
能量值=models.DecimalField(最大位数=6,小数位数=3)
fats=型号。小数字段(最大位数=6,小数位数=3)
饱和脂肪=models.DecimalField(
最大位数=6,小数位数=3,默认值=0)
碳水化合物=型号。小数点域(最大位数=6,小数点位=3)
sugars=models.DecimalField(最大位数=6,小数位数=3,默认值=0)
蛋白质=模型。小数字段(最大位数=6,小数位数=3)
salt=models.DecimalField(最大位数=6,小数位数=3,默认值=0)
类度量类型(ChoiceEnum):
BF=“早餐”
BR=“早午餐”
DN=“晚餐”
LN=“午餐”
SU=“晚餐”
班级餐(型号.型号):
食品=模型.ManyToManyField(食品,通过class='FoodDetails')
膳食类型=EnumChoiceField(enum\u类=MealType,null=True)
类食物详细信息(models.Model):
膳食=模型.ForeignKey(膳食,on_delete=模型.CASCADE)
食品=模型.ForeignKey(食品,on_delete=models.CASCADE)
食品重量=型号.DecimalField(
最大位数=6,小数位数=3,默认值=100)
类UserFoodHistory(models.Model):
膳食=模型.ManyToManyField(膳食,通过class='MealDate')
类别MealDate(models.Model):
用户\u食物\u历史=models.ForeignKey(
UserFoodHistory,on_delete=models.CASCADE)
膳食=模型.ForeignKey(膳食,on_delete=模型.CASCADE)
用餐日期=models.DateField(默认值=timezone.now,null=True)
类AppUser(AbstractUser):
食品历史=模型。外键(
UserFoodHistory,on_delete=models.CASCADE,null=True)
序列化程序.py

class FoodSerializer(serializers.ModelSerializer):
类元:
模型=食物
字段='\uuuu所有\uuuu'
类FoodDetailsSerializer(serializers.ModelSerializer):
food=serializers.ReadOnlyField(source='food.id')
类元:
模型=食物详情
字段=(‘id’、‘食物’、‘食物重量’)
类MealSerializer(serializers.ModelSerializer):
food=FoodDetailsSerializer(source='fooddetails\u set',many=True)
类元:
模型=膳食
字段=('id','MENT_type','food')
类MealDateSerializer(serializers.ModelSerializer):
MEIN=serializers.ReadOnlyField(source='mean.id')
类元:
型号=MealDate
字段=('id'、'用餐'、'用餐日期')
类UserFoodHistorySerializer(serializers.ModelSerializer):
MEIN=mealdate序列化程序(source='mealdate_set',many=True)
类元:
model=UserFoodHistory
字段=('id','mean')
类UserSerializer(serializers.ModelSerializer):
food_history=UserFoodHistorySerializer()
类元:
model=AppUser
字段=('id'、'username'、'email'、'food_history')
我想用这样的方式进行POST请求:

{
"user_id": 1,
"meal_date": "10-10-2019",
"meal_type": "BR",
"food_id": 12,
"food_weight": 120
}
现在,我只能通过管理面板创建所有内容,它看起来可以作为响应:

{
    "id": 2,
    "username": "kom1",
    "email": "kom1@wp.pl",
    "food_history": {
        "id": 1,
        "meal": [
            {
                "id": 1,
                "meal": 1,
                "meal_date": "2019-10-11"
            },
            {
                "id": 2,
                "meal": 6,
                "meal_date": "2019-10-11"
            },
            {
                "id": 3,
                "meal": 2,
                "meal_date": "2019-10-11"
            },
            {
                "id": 4,
                "meal": 3,
                "meal_date": "2019-10-11"
            },
            {
                "id": 5,
                "meal": 4,
                "meal_date": "2019-10-11"
            },
            {
                "id": 6,
                "meal": 5,
                "meal_date": "2019-10-11"
            }
        ]
    }
}

序列化程序类必须包含modelMealDate,使用APIVIEW创建自定义的post方法。 首先,创建UserFoodHistory实例,然后在MealDate中创建一个批量条目,并在user\u food\u history字段中传递该实例

在post API中传递旧id和新id,从请求和APIVIEW中删除MealDate中的旧条目(如果存在),并创建一个新条目