#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. О, хорошо, понял! Спасибо за всю помощь и ссылки.