fix: VisitSession 时间戳恢复 NOT NULL,测试补显式时间(修正计划的测试笔误)
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
# Generated by Django 5.2.17 on 2026-09-15 03:44
|
# Generated by Django 5.2.17 on 2026-09-15 03:46
|
||||||
|
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
import tracker.models
|
import tracker.models
|
||||||
@@ -65,8 +65,8 @@ class Migration(migrations.Migration):
|
|||||||
fields=[
|
fields=[
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('session_id', models.CharField(max_length=64)),
|
('session_id', models.CharField(max_length=64)),
|
||||||
('started_at', models.DateTimeField(blank=True, null=True)),
|
('started_at', models.DateTimeField()),
|
||||||
('ended_at', models.DateTimeField(blank=True, null=True)),
|
('ended_at', models.DateTimeField()),
|
||||||
('referrer_domain', models.CharField(blank=True, default='', max_length=200)),
|
('referrer_domain', models.CharField(blank=True, default='', max_length=200)),
|
||||||
('utm', models.JSONField(blank=True, default=dict)),
|
('utm', models.JSONField(blank=True, default=dict)),
|
||||||
('landing_path', models.CharField(blank=True, default='', max_length=500)),
|
('landing_path', models.CharField(blank=True, default='', max_length=500)),
|
||||||
|
|||||||
@@ -56,9 +56,8 @@ class VisitSession(models.Model):
|
|||||||
site = models.ForeignKey(Site, on_delete=models.CASCADE, related_name="sessions")
|
site = models.ForeignKey(Site, on_delete=models.CASCADE, related_name="sessions")
|
||||||
visitor = models.ForeignKey(Visitor, on_delete=models.CASCADE, related_name="sessions")
|
visitor = models.ForeignKey(Visitor, on_delete=models.CASCADE, related_name="sessions")
|
||||||
session_id = models.CharField(max_length=64)
|
session_id = models.CharField(max_length=64)
|
||||||
# null=True:会话可先建行后回填时间(ended_at 为空表示会话进行中)
|
started_at = models.DateTimeField()
|
||||||
started_at = models.DateTimeField(null=True, blank=True)
|
ended_at = models.DateTimeField()
|
||||||
ended_at = models.DateTimeField(null=True, blank=True)
|
|
||||||
referrer_domain = models.CharField(max_length=200, blank=True, default="")
|
referrer_domain = models.CharField(max_length=200, blank=True, default="")
|
||||||
utm = models.JSONField(default=dict, blank=True)
|
utm = models.JSONField(default=dict, blank=True)
|
||||||
landing_path = models.CharField(max_length=500, blank=True, default="")
|
landing_path = models.CharField(max_length=500, blank=True, default="")
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ def test_visitor_first_touch_fields():
|
|||||||
def test_event_unique_site_event_id():
|
def test_event_unique_site_event_id():
|
||||||
site = Site.objects.create(name="s", domains=["a.com"])
|
site = Site.objects.create(name="s", domains=["a.com"])
|
||||||
v = Visitor.objects.create(site=site, visitor_id="vid1")
|
v = Visitor.objects.create(site=site, visitor_id="vid1")
|
||||||
s = VisitSession.objects.create(site=site, visitor=v, session_id="sid1")
|
s = VisitSession.objects.create(site=site, visitor=v, session_id="sid1",
|
||||||
|
started_at="2026-09-15T10:00:00Z", ended_at="2026-09-15T10:01:00Z")
|
||||||
Event.objects.create(site=site, visitor=v, session=s, event_id="e1",
|
Event.objects.create(site=site, visitor=v, session=s, event_id="e1",
|
||||||
event_name="page_view", occurred_at="2026-09-15T10:00:00Z", path="/")
|
event_name="page_view", occurred_at="2026-09-15T10:00:00Z", path="/")
|
||||||
with pytest.raises(Exception):
|
with pytest.raises(Exception):
|
||||||
|
|||||||
Reference in New Issue
Block a user