我正在为一个大型Django应用程序编写测试,作为该过程的一部分,我将逐步为Django项目中不同应用程序的所有模型创建工厂。
但是,我在FactoryBoy中遇到了一些令人困惑的行为,在该行为中,似乎似乎SubFactories
具有最大深度,超过该深度则不会生成任何实例。
当我尝试运行以下测试时,发生错误:
def test_subfactories(self):
""" Verify that the factory is able to initialize """
user = UserFactory()
self.assertTrue(user)
self.assertTrue(user.profile)
self.assertTrue(user.profile.tenant)
order = OrderFactory()
self.assertTrue(order)
self.assertTrue(order.user.profile.tenant)
Run Code Online (Sandbox Code Playgroud)
最后一行将失败(AssertionError: None is not true
),通过调试器运行此测试将显示确实返回order.user.profile.tenant None
而不是预期的Tenant
实例。
这里涉及很多工厂/模型,但是布局相对简单。
的User
(django的默认值)和所述Profile
模型通过一个OneToOneField,其中(后有些麻烦)由表示连接UserFactory
和ProfileFactory
@factory.django.mute_signals(post_save)
class ProfileFactory(factory.django.DjangoModelFactory):
class Meta:
model = yuza_models.Profile
django_get_or_create = ('user',)
user = factory.SubFactory('yuza.factories.UserFactory')
birth_date = factory.Faker('date_of_birth')
street = factory.Faker('street_name')
house_number = factory.Faker('building_number')
city = factory.Faker('city')
country = factory.Faker('country')
avatar_file = factory.django.ImageField(color='blue') …
Run Code Online (Sandbox Code Playgroud) 我想在现有数据框中添加一个附加列,该数据框的长度为'seller_name'列作为其值.
输出应该是这样的:
seller_name name_length
-------------|-------------
Rick | 4
Hannah | 6
Run Code Online (Sandbox Code Playgroud)
但是,我很难获得正确的代码.
df['name_length'] = len(df['seller_name'])
Run Code Online (Sandbox Code Playgroud)
只给我整列的长度(6845)和
df['nl'] = df[len('seller_name')]
Run Code Online (Sandbox Code Playgroud)
引发KeyError.
有谁知道实现我的目标的正确命令?
非常感谢!
我们正在开发一个程序,其中状态的某些部分必须是持久的。由于许多原因,Localstorage 似乎是完美的解决方案,除了我们无法让它工作的部分。
起初,本地存储似乎总是落后于程序的其余部分更新,就好像它被提供了一个较旧的状态。我们尝试了 - 在参考了博客的一些提示后 - 以下方法
我们使用“setState”调用的回调更新本地存储。
this.setState(
{selection: this.state.selection.concat(shop_item) },
() => {
this.saveToLocal();
}
);
Run Code Online (Sandbox Code Playgroud)
“SaveToLocal”函数如下:
saveToLocal() {
const local = this.state.favourites;
this.localStorage.setItem(‘saveFavorites’, JSON.stringify(local));
}
Run Code Online (Sandbox Code Playgroud)
然而,这段代码似乎根本没有为 localstorage 提供任何价值。有没有人知道我们做错了什么?
我正在开发一个 Django 项目,并使用 mypy 进行类型检查。为了启用 django 的类型检查,我使用django-stubs包。
这很好用,但我现在遇到了 mypy 抛出两个我似乎无法解决的错误的情况:
Item "None" of "Optional[Season]" has no attribute "league"
Incompatible type for "league" of "Match" (got "Union[ForeignKey[Union[League, Combinable], League], Any]", expected "Union[League, Combinable, None]")
Run Code Online (Sandbox Code Playgroud)
这些错误是由下面的代码引发的。我正在启动(但不创建/保存到数据库)模型的实例Match
。
match = Match(
home_team=home_team,
away_team=away_team,
league=home_team.seasons.last().league,
season=home_team.seasons.all().last(),
)
Run Code Online (Sandbox Code Playgroud)
涉及的型号如下所示:
class League(models.Model):
name = models.CharField(max_length=200)
class Season(models.Model):
first_year = models.PositiveIntegerField()
second_year = models.PositiveIntegerField()
league = models.ForeignKey(
League, related_name="seasons", on_delete=models.CASCADE
)
class Team(models.Model):
name = models.CharField(max_length=200)
seasons = models.ManyToManyField(Season, related_name="teams")
class Match(models.Model):
league = …
Run Code Online (Sandbox Code Playgroud) 在我的数据框中,我有一列包含数字,一些正数,一些负数。例子
Amount
0 -500
1 659
3 -10
4 344
Run Code Online (Sandbox Code Playgroud)
我想把所有数字 Df['Amount'] 变成正数。我想过将所有数字乘以 *-1。但是,尽管这会将负数变为正数,但也会反过来。
有一个更好的方法吗?
我有一个记录跨越多年的数据框:
WarName | StartDate | EndDate
---------------------------------------------
'fakewar1' 01-01-1990 02-02-1995
'examplewar' 05-01-1990 03-07-1998
(...)
'examplewar2' 05-07-1999 06-09-2002
Run Code Online (Sandbox Code Playgroud)
我正在尝试将此数据框转换为每年总战争的摘要概述,例如:
Year | Number_of_wars
----------------------------
1989 0
1990 2
1991 2
1992 3
1994 2
Run Code Online (Sandbox Code Playgroud)
通常我会使用某种方式df.groupby('year').count()
来获得按年计算的总战争,但由于我目前正在使用范围而不是设定日期,因此这种做法无效.
我目前正在编写一个生成年份列表的函数,然后列表中的每一年检查数据框中的每一行并运行一个函数来检查年份是否在该行的日期范围内(如果该行返回True)是这样的).
years = range(1816, 2006)
year_dict = {}
for year in years:
for index, row in df.iterrows():
range = year_in_range(year, row)
if range = True:
year_dict[year] = year_dict.get(year, 0) + 1
Run Code Online (Sandbox Code Playgroud)
这有效,但似乎也非常复杂.所以我想知道,我错过了什么?解决这个问题的规范"熊猫方式"是什么?
我们目前正在开发一个 Django CRUB 风格的 Web 应用程序,其中多个“租户”每个都有自己的“成员”(链接到该租户的用户)、“课程”等。
我们希望包含“使用 google 登录”选项,因此转向 Django-allauth。大多数租户使用 Google G 套装并拥有自己的[name]@[tenant].com
地址。
创建帐户后,用户将被分配给其租户,为了防止租户 B 的用户在租户 A 中创建帐户,我们添加了一个功能来检查电子邮件的域是否与域中的“域”字段匹配。租户对象。仅当确实发生这种匹配时,才会创建帐户。
然而,最近我们的一位租户开始使用超过 1 个电子邮件域,这要求我们更新代码和租户对象。(使代码处理多个电子邮件域,更改模型,以便租户可以拥有多个电子邮件域)
这让我们想知道是否有更好的方法来做到这一点 - 我们一直在调查谷歌是否提供了响应company_id
,或者任何可以帮助我们识别电子邮件域之外的公司的信息。这些值可以帮助我们检查用户是否确实属于该租户,而无需不断检查/更新电子邮件域字段 - 但我们一直无法找到此类内容。
对这个类似的stackoverflow 问题的回答表明我们采用了与我们目前正在采取的方法类似的方法,但那是五年前的事了 - 这仍然是真正的最佳方法吗?
在我的 Profile 模型中,我具有以下功能:
它用于返回用户的全名(如果缺少某些数据,则可以使用替代方法)。
def full_name(self):
first_name = self.user.first_name.strip()
if first_name and self.user.last_name:
if not self.middle_name:
full_name = u'%s %s' % (first_name, self.user.last_name)
else:
full_name = u'%s %s %s' % (first_name, self.middle_name,
self.user.last_name)
return full_name.strip()
elif first_name:
return first_name
return self.user.username
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:我有一个视图,我根据变量“q”(从模板中的搜索框返回)过滤查询集,如下所示:
qs = qs.filter(tenant_demo_purchase=True).order_by('-id')
#Search users within results
q = self.request.GET.get('q', None)
if q:
qs = qs.filter(Q(user__username__icontains=q) |
Q(user__first_name__icontains=q) |
Q(user__last_name__icontains=q) |
Q(arrangement_period__arrangement__title__icontains=q) |
).filter(tenant_demo_purchase=True).order_by('-id')
else:
pass
return qs
Run Code Online (Sandbox Code Playgroud)
如果我给它一个名字、用户名或姓氏,这个过滤器就可以正常工作。但是如果我给它一个名字+姓氏(例如:“John Doe”),它不会返回任何结果。
我的大多数用户倾向于提交全名,因此作为一种解决方案,我试图让它访问 Profile.full_name 函数。通过添加以下行
Q(user__profile__fullname__icontains=q)
Run Code Online (Sandbox Code Playgroud)
但是,这会崩溃并显示以下错误消息:
raise FieldError('Related Field …
Run Code Online (Sandbox Code Playgroud) 我有一个非常大的数据框,带有日期 Index ,涵盖了多年的时间段。每一天都包含多个值。
Date (DT_index) Description Value1
1 2015-01-12 stringvalue 10
2 2015-01-12 stringvalue 12
3 2015-01-12 stringvalue 14
4 2015-02-12 stringvalue 16
5 2015-02-12 stringvalue 348
6 2015-09-12 stringvalue 1
7 2015-09-12 stringvalue 9
(.....)
8456 2017-11-03 stringvalue 10
8457 2017-11-03 stringvalue 111
8458 2017-11-04 stringvalue 29
Run Code Online (Sandbox Code Playgroud)
我想要的是根据月/年将此 csv 拆分为单独的文件。(因此文件如下:12-2015.csv、01-2016.csv、02-2016.csv)
我已将大型 csv 加载到 pandas df 中,并按月对其进行分组,如下所示
dfgp = df.groupby(pd.TimeGrouper(freq='M'))
Run Code Online (Sandbox Code Playgroud)
但我唯一可用的操作似乎是“总和”或“平均”之类的东西。我不希望这样做,我想按月对大型 DF 进行切片,而不是执行更改或聚合数据的 .apply 操作。
我也尝试过这段代码:
dfgp = [group[1] for group in df.groupby(df.index.date)]
for x in result:
name = str(x.index.date.month.year) …
Run Code Online (Sandbox Code Playgroud) 我在我的 views.py 中创建了一个 api_root
@api_view(['GET'])
def api_root(request, format=None):
return Response({
'books': reverse('api_book_list'),
'users': reverse('api_user_list')
})
Run Code Online (Sandbox Code Playgroud)
这是由我的 rest_api.urls.py 引用的
urlpatterns = [
url(r'', api_root),
url(r'^books/$', BookList.as_view(), name='api_book_list'),
url(r'^books/(?P<pk>[0-9]+)/$', BookDetail.as_view(), name='book-detail'),
url(r'^users/$', UserList.as_view(), name='api_user_list'),
url(r'^users/(?P<pk>[0-9]+)/$', UserDetail.as_view(), name='user-detail'),
]
Run Code Online (Sandbox Code Playgroud)
我的项目根 urls.py 使用以下 url-config 链接到 rest_api.urls.py:
url(r'^api/v1/', include('rest_api.urls', namespace='api')),
Run Code Online (Sandbox Code Playgroud)
然而,当我访问 /api/v1/ 页面时,我收到以下错误:
NoReverseMatch at /api/v1/
Reverse for 'api_book_list' not found. 'api_book_list' is not a valid view
function or pattern name.
Run Code Online (Sandbox Code Playgroud)
但是我已经在我的 urls.py 中定义了模式名称,有没有人知道为什么 Django 仍然无法识别它?