使用多个列作为ForeignKey在另一个表中返回

时间:2016-10-19 07:42:46

标签: python django postgresql object django-models

我是Django的新手所以我制作了3个简单的表来返回一个愿望清单。问题是我希望每当用户请求WishList时,他/她的user_id用于进行SELECT查询以返回他/她自己的愿望清单。我想从我的愿望清单表中获取产品名称和产品网址。我使用to_field,但这样我才能获得产品名称。我不太了解Django所以请帮助我!

产品

class Product(models.Model):
    class Meta:
        unique_together = (('id', 'title'),)
    title = models.CharField(max_length=200, unique=True,
                             help_text='Name of the product')
    url = models.CharField(max_length=300, default='',
                           help_text='Url of the product')

    def __str__(self):
        return 'Product: {}'.format(self.title)

愿望清单中

class WishList(models.Model):
    class Meta:
        unique_together = (('user', 'product'),)

    user = models.ForeignKey(fbuser,
                         on_delete=models.CASCADE,
                         help_text='Facebook user',
                         to_field='user_id')
    product = models.ForeignKey(Product, to_field='title', db_column='title',
                            on_delete=models.CASCADE)

    def __str__(self):
        return 'WishList: {}'.format(self.user)

1 个答案:

答案 0 :(得分:1)

Django文档是你的朋友,read it

我很认真,请阅读整个documentation

此外,将to_field覆盖到与您的model.pk不同的另一个字段并不是一个好的做法,除非你有一个非常好的理由而且你知道你在做什么(现在绝对不是这样)。

因此,在您阅读完文档后,您将知道为了获得与用户相关的愿望,您可以使用ForeignKey反向关系获取用户的所有相关愿望清单。

user_wishlists = my_user.wishlist_set.all()
#Because we know that you want to access the wishlist.products
#in order to optimize things (in terms of db queries)
#you can add and .select_related('product')
#e.g, user_wishlists = my_user.wishlist_set.all().select_related('product')

#now follow the wishlist.product foreign key to access the related product for every wishlist
for wishlist in user_wishlists:
    product = wishlist.product
    print (product.id, product.title, product.url)

现在,在您阅读了更多文档之后 您会注意到WishList模型实际上是intermediate model ManyToMany User与他希望的产品之间的关系,然后您就会知道您可以定义一个M2M字段通过WishList之间的用户和产品之间如下:

class FbUser(models.Model):
    #...
    wished_products = models.ManyToManyField(
        Product,
        through='WishList',
        through_fields=('user', 'product')
    )

#and now accessing user wished products would be easy as:
user_wished_products = my_user.wished_products.all()
for product in user_wished_products:
    print (product.id, product.title, product.url)