[英]How can I link/or combine my three Django models to better maximize relationship and efficency
Im trying to model out my dB for my Django app.我试图为我的 Django 应用程序输出我的分贝。
I'm pretty content with that I have so far, only I have two questions regarding my models.到目前为止,我很满意,只是我对我的模型有两个问题。
Here's a quick run-through of them.这是它们的快速浏览。
UserBuckets
contains every bucket a user has created. UserBuckets
包含用户创建的每个存储桶。
TotalBuckets
contains the total number of buckets a user has created. TotalBuckets
包含用户创建的桶的总数。
Bucket
Contains information for whats inside each user bucket. 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
Here are my two questions:这是我的两个问题:
1.
I can see the argument of combining UserBuckets
+ TotalBuckets
, however my only problem with that is the repeating the same datapoint for every new object that gets created. 1.
我可以看到结合UserBuckets
+ TotalBuckets
的论点,但我唯一的问题是为每个新创建的 object 重复相同的数据点。 To keep things "clean", I separated them.为了保持“干净”,我将它们分开。 Is this the "correct" procedure?
这是“正确”的程序吗?
2.
How can I properly reference that each bucket
is an object based off of UserBuckets
. 2.
如何正确引用每个bucket
是基于 UserBuckets 的UserBuckets
。 I used a foreign key and a many-to-many key but doesn't that only cover the relationship basis?我使用了外键和多对多键,但这不只涵盖关系基础吗?
Thank you for any help.感谢您的任何帮助。
You only need the User-object and the Bucket-objects related to the user to find every bucket the user has created and the number of buckets the user has.您只需要 User-object 和与用户相关的 Bucket-objects 即可找到用户创建的每个存储桶以及用户拥有的存储桶数量。
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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.