создать django модель с именами полей из списка - PullRequest
0 голосов
/ 29 марта 2020

У меня есть django модель в моем файле models.py, например:

class Inventory(models.Model):
    player = models.CharField(max_length=30)
    apples = models.IntegerField()
    bananas = models.IntegerField()

Где каждый «игрок» имеет разное количество фруктов в своем инвентаре. Со временем я буду менять возможные плоды, поэтому я хотел бы динамически создавать эти поля из списка. Итак, сейчас список будет [«яблоки», «бананы»], но позже я хотел бы иметь [«яблоки», «апельсины», «лимоны»]. Есть ли способ создать имена полей из списка?

1 Ответ

1 голос
/ 29 марта 2020

Возможно, вы захотите взглянуть на models.ManyToManyField и использовать хотя-отношения. https://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_many/ https://docs.djangoproject.com/en/3.0/ref/models/fields/#django .db.models.ManyToManyField.through

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

class Inventory(models.Model):
    player = models.CharField(max_length=30)
    fruits = models.ManyToManyField(
        Fruit,
        through='FruitContent'
    )

class FruitContent(models.Model):
    fruit = models.ForeignKey(Fruit, models.CASCADE)
    inventory = models.ForeignKey(Inventory, models.CASCADE)
    count = models.PositiveIntegerField()

    # Protect your data structure
    class Meta:
        constraints = [
            UniqueConstraint(fields=['fruit', 'inventory'], name='unique_ownership')
        ]

Это с сохранением модели инвентаризации, но это действительно немного неловко Делать это. Я бы предпочел что-то вроде этого:

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

class Player(models.Model):
    name = models.CharField(max_length=30)
    inventory = models.ManyToManyField(
        Fruit,
        through='PlayerFruits'
    )

class PlayerFruits(models.Model):
    fruit = models.ForeignKey(Fruit, models.CASCADE)
    player = models.ForeignKey(Player, models.CASCADE)
    count = models.PositiveIntegerField()

    # Protect your data structure
    class Meta:
        constraints = [
            UniqueConstraint(fields=['fruit', 'player'], name='unique_ownership')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...