Как я могу связать / или объединить мои три модели Django, чтобы лучше максимизировать взаимосвязь и эффективность

#python #django

#питон #джанго

Вопрос:

Я пытаюсь смоделировать свою базу данных для моего приложения Django.

Я вполне доволен тем, что у меня есть до сих пор, только у меня есть два вопроса относительно моих моделей.

Вот краткий обзор их.

UserBuckets содержит все корзины, созданные пользователем.

TotalBuckets содержит общее количество корзин, созданных пользователем.

Bucket Содержит информацию о том, что находится внутри каждой пользовательской корзины.

 class UserBuckets(models.Model):
    
    username = models.ForeignKey(UserModel.username)
    bucket_name = models.CharField()

    def get_all_buckets(self):
        all_buckets = UserBuckets.objects.all('bucket_name')
        return all_buckets

    def __str__(self):
        return self.bucket_name


class TotalBuckets(models.Model):

    username = models.ForeignKey(UserBuckets.username)
    total_buckets = models.IntegerField(blank=True, null=True)

    def total_buckets_calc(self):
        self.total_buckets = TotalBuckets.objects.aggregate(Sum('bucket_name', distinct=True))
        self.save()
    
    def __str__(self):
        return self.total_buckets

class Bucket(models.Model):

    owner = models.ManyToManyField(UserBuckets.username)
    bucket = models.ForeignKeyField(UserBuckets.bucket_name, on_delete=models.CASCADE)
    stocks = ArrayField(models.CharField(max_length=6),size=10) 
    stocks_in_bucket = models.IntegerField(blank=True, null=True)
    created = models.DateField(auto_now_add=True)
    slug = models.SlugField(unique=True, blank=True)

    def total_stocks_calc(self):
        self.stocks_in_bucket = Bucket.objects.aggregate(Sum('stocks_in_bucket', distinct=True))
        self.save()

    def get_absolute_url(self):
        return reverse("bucket:bucket-view", kwargs={"slug": self.slug})

    def __str__(self):
        return self.stocks
 

Вот мои два вопроса:

1. Я вижу аргумент объединения UserBuckets TotalBuckets , однако моя единственная проблема с этим заключается в повторении одной и той же точки данных для каждого нового создаваемого объекта. Чтобы сохранить вещи «чистыми», я разделил их. Является ли это «правильной» процедурой?

2. Как я могу правильно ссылаться на то, что каждый bucket из них является объектом, основанным на UserBuckets . Я использовал внешний ключ и ключ «многие ко многим», но разве это не распространяется только на основу отношений?

Спасибо вам за любую помощь.

Ответ №1:

Вам нужен только объект User и объекты Bucket, связанные с пользователем, чтобы найти каждую корзину, созданную пользователем, и количество корзин, которые есть у пользователя.

 class User(models.Model):
    username = models.CharField()

class Bucket(models.Model):

    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='buckets')
    stocks = ArrayField(models.CharField(max_length=6),size=10) 
    stocks_in_bucket = models.IntegerField(blank=True, null=True)
    created = models.DateField(auto_now_add=True)
    slug = models.SlugField(unique=True, blank=True)

    def total_stocks_calc(self):
        self.stocks_in_bucket = Bucket.objects.aggregate(Sum('stocks_in_bucket', distinct=True))
        self.save()

    def get_absolute_url(self):
        return reverse("bucket:bucket-view", kwargs={"slug": self.slug})

    def __str__(self):
        return self.stocks



EXAMPLE

user = User('Gabbeh')
b1 = Bucket(owner=user, ...)
b2 = Bucket(owner=user, ...)

all_buckets_owned_by_user = User.buckets()  # from related_name
all_buckets_owned_by_user = User.bucket_set()  # djangos naming wihtout setting related name
# or 
all_buckets_owned_by_user = Buckets.objects.filter(owner=user)

# To count just do .count() on the end of either query above.
 

Комментарии:

1. Это намного проще, чем мои оригинальные модели, спасибо. Не было бы необходимости добавлять имя корзины в User модель?

2. Нет, в этом нет необходимости. Django автоматически добавляет атрибут, чтобы получить все сегменты для пользователя. Я полагаю, что это обычно .bucket_set() происходит в вашем примере. Если вы новичок в базах данных, вам, вероятно, следует посмотреть несколько вступительных видеороликов по этому вопросу, и это облегчит вам понимание этого и в django. Проверьте документы по ForeignKey и сделайте запросы для некоторых документов по внешним ключам и тому, как это работает. В основном последнее.

3. О, хорошо, понял! Спасибо за всю помощь и ссылки.