selectjlated在django中的多个到多个字段中,或者我如何使用.all()访问多个到多个字段

时间:2009-06-25 18:14:10

标签: django django-models

我正在使用南方编写数据迁移...但问题是指使用select_related来检索多个到多个字段。

文档指定select_related可以用于使用ForeignKey的关系字段...我无法理解它不能使用ManyToMany字段吗?

我的字段为空= null但文档说您仍然可以调用select_related('field_name'),它将拉出相关关系。但当我试图在下面这样做时...

其中listing是查询集中的项目

for listing in RealEstateListing.objects.all():
        listing_type_slug_url = slugify(listing.listing_type.name)
        sub_type = orm.SubType.objects.get(slug_url=listing_type_slug_url)
        pricing_option = PricingOption.objects.get(name=listing.pricing_option.name)
        lt = orm.Listing(listing_type=sub_type.parent,
                         sub_type=sub_type,
                         expiration_date=listing.expiration_date,
                         title=listing.title,
                         slug_url = listing.slug_url,
                         description = listing.description,
                         contact_person=listing.contact_person,
                         secondary_contact=listing.secondary_contact,
                         address=listing.address,
                         location=listing.location,
                         price=listing.price,
                         pricing_option=pricing_option,
                         display_picture=listing.display_picture,
                         image_gallery=listing.image_gallery,
                         date_added=listing.date_added,
                         status=listing.status,
                         featured_on_homepage=listing.featured_on_homepage,
                         )
        lt.save()    

        lt.features.clear()
        if listing.property_features:
            property_features = listing.property_features.all()
        else:
            property_features = None
        if property_features:    
            for ft in property_features:
                ft_ = Feature.objects.get(name=ft.name)
                lt.features.add(ft_)

我收到错误,告诉我它无法解析字段property_features ...可用字段只是id&名字......似乎它没有拉动关系。

我的另一个问题是,如果我们不能使用select_related来访问多个到多个字段的替代方案吗?

----------------------------------------------- -edit ----------------------------------------

我删除了我用来进行数据迁移的南方假冒orm的引用。

我基本上用上面的代码做的是获取所有RealEstateListings对象然后在for循环中创建一个新的Listing对象,其中包含来自旧RealEstateListings的数据

最后一部分是我遇到问题的地方,并给出了上面的错误以及来自旧RealEstateListing模型的多对多字段property_features

1 个答案:

答案 0 :(得分:2)

调试代码几乎是不可能的,因为它似乎在您使用的方法中失败。我的猜测是你正在做objects.filter(property_features = ...)希望用一个值替换property_features。你不能这样做,因为它是作为关键字参数编写的。

您似乎也误解了select_related的使用。它纯粹用于避免访问相关对象的额外查询。我不确定M2M领域,但它们与FK不一样,所以不要指望它们会做出同样的反应。

编辑:

所以RealEstateListing有一个名为property_features的M2M

首先,if if语句不好:

if listing.property_features: 
    property_features = listing.property_features.all()
else:
    property_features = None
if property_features:

由于所有RealEstateListing都有一个M2M,因此isting.property_features将返回一个django.db.models.fields.related.ManyRelatedManager对象,该对象将评估为True。如果列表中没有M2M字段,您将获得AttributeError。但是,这不是您获得的错误,但您应将上述代码更改为:

property_features = listing.property_features.all()
if property_features:

这将执行相同的操作,因为如果没有property_features,则对象上的property_features变量将是一个空列表。

现在到了实际的错误。我必须说,你在这里写的任何内容都不会产生这个错误。就像之前你会遇到这样的错误,如果你做了像

这样的事情
Listing.objects.filter(property_features=x)

发布完整的回溯将有助于确定问题出现的地方。