Django ManyToMany передачи переменных - PullRequest
0 голосов
/ 17 января 2020

Я запустил свой проект Django и хочу поделиться данными между двумя классами. Я не уверен, правильно ли я это делаю. Это работает, но я не хочу вносить в мой проект плохие практики. Мой код выглядит следующим образом:

class Products(models.Model):
    name = models.CharField(max_length=50)
    protein = models.FloatField()
    carbohydrates = models.FloatField()
    fat = models.FloatField()
    food_type = models.CharField(max_length=6, choices=(
        ("1", "Meat"),
        ("2", "Fruit")
        )
    )
class Meals(models.Model):#Child
    name = models.CharField(max_length=50)
    ingredient = models.ManyToManyField(Products)

    def protein(self):
        protein = 0
        for ing in self.ingredient.all():
            protein += ing.protein
        return protein 

    @property
    def carbohydrates(self):
        carbohydrates = 0
        for ing in self.ingredient.all():
            carbohydrates += ing.carbohydrates
        return carbohydrates 

    def diet_category(self):        
        diet_types = "vegan, vegeterian, Keto, Paleo, Gluten-free"
        food_types = ""
        for ing in self.ingredient.all():
            food_types += ing.food_type
        if "1" in food_types: 
            diet_types.replace("vegan, ", "").replace(" vegeterian,", "")
        return (diet_types + " | " + food_types)

Кроме того, у меня проблема с функцией .replace () в python, которую я хочу использовать здесь, чтобы исключить некоторые слова из переменной.

Подводя итог моим вопросам:

-Получение свойств из другого класса осуществляется путем ссылки на объект этого класса. В этом случае Products.objects.all ()

-Как я могу удалить слова из переменной в моделях.

-Можно ли использовать @property для функций, которые возвращают значения из другого класса?

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Replace ()

Функция replace() возвращает копию строки с замененными значениями. Это не изменит исходную строку.

Так что вам нужно сделать что-то вроде

diet_types = diet_types.replace("vegan, ", "")
diet_types = diet_types.replace("vegetarian, ", "")

Выборка значений

Вы можете l oop как вы делаете или используете запрос для достижения того же, что-то вроде:

def protein(self):
    return self.ingredient.aggregate(Sum('protein'))['protein__sum']

См. документы по агрегации для более подробной информации.

Свойства

ИМХО это дело вкуса

0 голосов
/ 17 января 2020

Ваши классы могут иметь свойства, зависящие от других классов, но убедитесь, что вы обрабатываете исключение , когда в другом классе не найдено значений. Поэтому я считаю, что использование @ property - неплохая идея .

Кроме того, вы пытались использовать

diet_types.replace("vegan, ", " vegeterian")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...