社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

如何在Django中将数据保存到不同的模型

Ema • 3 年前 • 1232 次点击  

你们所有人, 我想尝试在另一个表中保存数据。 有“最爱的桌子”和“食物桌”,我需要做的是,当用户单击“添加”按钮时,将“最爱的食物”模式转换为“食物桌”。在传输数据时,我不希望丢失从收藏夹表添加的数据,而是将其保留在收藏夹表中。

任何评论都是有帮助的,提前感谢您的时间!!


def add_to_today_foods(request, pk):
  favorite = get_object_or_404(Favorite, pk=pk)
  food = favorite
  if request.method == 'POST':
      food.user = request.user
      food.save()
      return redirect('today_foods')
  context = {
    'food': food,
    'favorite': favorite,
  }
  return render(request, 'base/add_to_today_foods.html', context)
from django.urls import path
from .views import FoodCreate, FoodUpdate, FoodDelete, FoodList, TargetCreate

from . import views

urlpatterns = [
  path('', views.foods, name='today_foods'),
  path('all_foods', FoodList.as_view(), name='all_foods'),
  path('all_foods/search/', views.food_search, name='food_search'),
  path('favorite', views.favorite, name='favorite'),
  path('favorite/delete/<int:pk>', views.favorite_delete, name='favorite_delete'),
  path('favorite/update/<int:pk>', views.favorite_update, name='favorite_update'),
  path('favorite/add_to_today_foods/<int:pk>', views.add_to_today_foods, name='add_to_today_foods'),
  path('target', TargetCreate.as_view(), name='target'),
  # path('', FoodList.as_view(), name='foods'),
  path('create/', FoodCreate.as_view(), name='food-create'),
  path('update/<int:pk>', FoodUpdate.as_view(), name='food-update'),
  path('delete/<int:pk>', FoodDelete.as_view(), name='food-delete'),

]
{% extends 'base.html' %}
{% block title %}|お気に入り登録{% endblock %}
{% block content %}


<div class="header-bar">
  <a href="{% url 'today_foods' %}">&#8592; 戻る</a>
</div>

<div class="body-container">
  <div class="body-header">
    <h1>お気に入り登録</h1>
  </div>
  <div class="notion2">
    <p>※数字は半角で打ち込んでください</p>
  </div>
  <form action="{% url 'favorite' %}" method="post">
    {% csrf_token %}
    {{ form }}
    <button class="button" type="submit">追加</button>
  </form>

  <!-- table -->
  <div class="food-items-wrapper">
    <table>
      <tr class="table-header">
        <th class="align-left">食べもの</th>
        <th>kcal</th>
        <th>P</th>
        <th>F</th>
        <th>C</th>
        <th>カテゴリ</th>
      </tr>
      {% if favorites %}
        {% for favorite in favorites %}
          <tr>
            <td class="align-left">{{ favorite.name }}</td>
            <td>{{ favorite.kcal }}</td>
            <td>{{ favorite.protein }}</td>
            <td>{{ favorite.fat }}</td>
            <td>{{ favorite.carb }}</td>
            <td>{{ favorite.category }}</td>
            <td><a href="{% url 'favorite_update' favorite.id %}"><i class="far fa-edit"></i></a></td>
            <td><a href="{% url 'favorite_delete' favorite.id %}"><i class="far fa-trash-alt"></i></a></td>
            <td><a href="{% url 'add_to_today_foods' favorite.id %}"><i class="fas fa-plus"></i></a></td>
          </tr>
        {% endfor %}
      </table>
    {% else %}
      <td colspan="8" class="no-results">|お気に入り登録された食べものはありません。|</td>
    {% endif %}
  </div>
</div>

{% endblock %}
from django.db import models
from django.contrib.auth.models import User
from django.core.validators import MaxValueValidator, MinValueValidator
from datetime import date
# Create your models here.
FOOD_CATEGORY = (('朝食','朝食'),('昼食','昼食'), ('夕食','夕食'),('間食','間食'))
class Food(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, verbose_name='ユーザー')
  category = models.CharField(max_length=200, choices=FOOD_CATEGORY, verbose_name='カテゴリー')
  name = models.CharField(max_length=200, verbose_name='名前')
  kcal = models.PositiveSmallIntegerField(verbose_name='カロリー')
  protein = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)], verbose_name='タンパク質')
  fat = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)], verbose_name='脂質')
  carb = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)], verbose_name='炭水化物')
  eaten_date = models.DateField(verbose_name='食べた日付', default=date.today, help_text='※yyyy-mm-dd')
  created = models.DateTimeField(auto_now_add=True, verbose_name='作成日')
  def __str__(self):
      return self.name

class Target(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, verbose_name='ユーザー')
  kcal = models.PositiveSmallIntegerField(verbose_name='カロリー')
  protein = models.DecimalField(max_digits=4, decimal_places=1, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)], verbose_name='タンパク質')
  fat = models.DecimalField(max_digits=4, decimal_places=1, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)], verbose_name='脂質')
  carb = models.DecimalField(max_digits=4, decimal_places=1, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)], verbose_name='炭水化物')
  created = models.DateTimeField(auto_now_add=True, blank=True, null=True, verbose_name='作成日')
  # 以下はadminページでの表示、正味いらん、あとエラーになる
  # def __str__(self):
  #   return self.user

class Favorite(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, verbose_name='ユーザー')
  category = models.CharField(max_length=200, choices=FOOD_CATEGORY, verbose_name='カテゴリー')
  name = models.CharField(max_length=200, verbose_name='名前')
  kcal = models.PositiveSmallIntegerField(verbose_name='カロリー')
  protein = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)], verbose_name='タンパク質')
  fat = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)], verbose_name='脂質')
  carb = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True, default=0.0, validators=[MaxValueValidator(999.9), MinValueValidator(0.0)], verbose_name='炭水化物')
  created = models.DateTimeField(auto_now_add=True, verbose_name='作成日')
  def __str__(self):
      return self.name
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129891
 
1232 次点击  
文章 [ 2 ]  |  最新文章 3 年前
rzlvmp
Reply   •   1 楼
rzlvmp    3 年前

我想尝试在另一个表中保存数据。有最喜欢的桌子和食物桌,我需要做的是把最喜欢的模型上的食物转移到食物桌上

如何在两个相同的表之间复制数据的简单示例:

范例

from django.db import models

class Food(models.Model):
    name = models.CharField(max_length=30)
    price = models.CharField(max_length=30)

    class Meta:
        db_table = "food"

class Favorite(Food):
    class Meta:
        db_table = "favorite"

复制过程(使用 ID = 1 (进入收藏夹)

from djangoapp.models import Food, Favorite

food = Food.objects.get(id=1)
favorite = Favorite()
for attr in food._meta.fields:
  if attr.verbose_name == 'ID':
    continue
  setattr(favorite, attr.verbose_name, getattr(food, attr.verbose_name))
favorite.save()

但是在没有特殊原因的情况下,在数据库中复制数据是非常糟糕的方式。

例如,您的食物可能会在菜单中停止,但客户仍然可以在最喜欢的数据中看到它。所以你需要删除食物和最喜欢的桌子的数据

更好的方法是创建关系表,而不是复制数据:

from django.db import models

class Food(models.Model):
    name = models.CharField(max_length=30)
    price = models.CharField(max_length=30)

    class Meta:
        db_table = "food"

class Client(models.Model):

    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

    class Meta:
        db_table = "client"

class Favorite(models.Model):

    client_id = models.ForeignKey(Client)
    food_id = models.ForeignKey(Food)

    class Meta:
        db_table = "favorite"

之后,您可以在收藏夹中添加新记录:

favorite = Favorite()
favorite.client_id = 1
favorite.food_id = 2
favorite.save()

这意味着 Client 具有 ID=1 补充 Food 具有 ID = 2 拥有 Favorites

在这种情况下,如果删除 食物 具有 ID=2 最爱的关系 [1,2] 也将被删除(取决于设置)。

  • 根据其他车型信息编辑1更新答案

好的,在你的情况下,将食物数据复制到收藏夹中会是这样的

def add_to_today_foods(request, pk):
  food = get_object_or_404(Food, pk=pk)
  favorite = Favorite()
  
  if request.method == 'POST':
    for attr in food._meta.fields:
      if attr.verbose_name in ['ID', 'eaten_date']:
        continue
      setattr(favorite, attr.verbose_name, getattr(food, attr.verbose_name))
    favorite.user = request.user
    favorite.save()
    return redirect('today_foods')
  context = {
    'food': food,
    'favorite': favorite,
  }
  return render(request, 'base/add_to_today_foods.html', context)

*しかし、データをコピーする方法、非常におすすめではりません。

Shonsave
Reply   •   2 楼
Shonsave    3 年前

可以从food表中读取数据,并在Favorite foods表中创建具有相同值的对象。 我看不到模型,所以无法提供您需要编写的代码。

作为替代方案,您还可以创建一个名为Favorite的布尔字段,将一些食物标记为Favorite。这样,您就不必创建新模型。