Py学习  »  Django

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

Ema • 3 年前 • 1229 次点击  

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

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


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
 
1229 次点击  
文章 [ 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。这样,您就不必创建新模型。